2010-09-09 1 views
0

У меня есть таблица с записями, и каждая запись может иметь разные типы учетных записей. Я пытаюсь определить и вернуть учетную запись на основе значения типа cindofBelongs_to на основе значения поля

Каждый счет имеет одну таблицу, account_site и account_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 

Пытались сделать это в методе allso, но не повезло. На самом деле хотят иметь только один account и не разные имена belongs_to. Кто-нибудь, кто может понять, чего я хочу? Трудно объяснить по-английски.

Terw

ответ

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 
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