views:

16

answers:

2

Hello, I have a table with entries, and each entries can have different account-types. I'm trying to define and return the account based on the value of cindof

Each account type has one table, account_site and account_page. So a regular belongs_to won't do.

So is there any way to return something like:

belongs_to :account, :class_name => "AccountSite", :foreign_key => "account_id" if cindof = 1
belongs_to :account, :class_name => "AccountPage", :foreign_key => "account_id" if cindof = 2

Have tried to do that in a method allso, but no luck. Really want to have just one accountand not different belongs_to names. Anyone that can figure out what I want? Hard to explain in English.

Terw

A: 

I would look into Single Table Inheritance. Not 100% sure, but I think it would solve your problem http://code.alexreisner.com/articles/single-table-inheritance-in-rails.html

If that isn't good, this isn't too hard to implement yourself.

def account
  case self.cindof
    when 1 then AccountSite.find self.account_id
    when 2 then AccountPage.find self.account_id
  end
end
Matt Briggs
+1  A: 

You should be able to do what you want with a polymorphic association. This won't switch on cindof by default, but that may not be a problem.

class ObjectWithAccount < ActiveRecord::Base
  belongs_to :account, :polymorphic => true
end

class AccountSite < ActiveRecord::Base
  has_many :objects_with_accounts, 
        :as => :account, 
        :class_name => 'ObjectWithAccount'
end

class AccountPage < ActiveRecord::Base
  has_many :objects_with_accounts, 
        :as => :account, 
        :class_name => 'ObjectWithAccount'
end

You will need both an account_id column and a account_type column. The type of the account object is then stored in the extra type column.

This will let you do:

obj.account = AccountPage.new

or

obj.account = AccountSite.new
Shadwell