Belongs_to基于字段的值

时间:2010-09-09 13:01:30

标签: ruby-on-rails belongs-to rails-models

我有一个包含条目的表,每个条目可以有不同的帐户类型。我正在尝试根据cindof

的值定义并返回帐户

每种帐户类型都有一个表account_siteaccount_page。因此,常规belongs_to不会这样做。

有没有办法返回类似的东西:

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

尝试用方法做到这一点,但没有运气。真的只想拥有一个account而不是belongs_to个名字。 谁能弄清楚我想要什么?很难用英语解释。

Terw

2 个答案:

答案 0 :(得分:2)

你应该能够通过多态关联做你想做的事。默认情况下,这不会启用cindof,但这可能不是问题。

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

您需要account_id列和account_type列。然后,帐户对象的类型将存储在额外类型列中。

这将允许你这样做:

obj.account = AccountPage.new

obj.account = AccountSite.new

答案 1 :(得分:0)

我会研究单表继承。不是100%肯定,但我认为它可以解决您的问题http://code.alexreisner.com/articles/single-table-inheritance-in-rails.html

如果这不好,那自己实施起来并不难。

def account
  case self.cindof
    when 1 then AccountSite.find self.account_id
    when 2 then AccountPage.find self.account_id
  end
end