2010-09-09 5 views
0

J'ai une table avec des entrées, et chaque entrée peut avoir différents types de comptes. Je suis en train de définir et de rendre le compte en fonction de la valeur de cindofAppartient à la valeur d'un champ

Chaque type de compte a une table, account_site et account_page. Donc, un belongs_to ne fera pas.

est-il possible de revenir donc quelque chose comme:

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 

ont essayé de le faire dans une méthode allso, mais pas de chance. Vraiment envie d'avoir un seul account et pas différents noms belongs_to. Toute personne qui peut comprendre ce que je veux? Difficile à expliquer en anglais.

Terw

Répondre

0

Je regarderais dans l'héritage de table. Pas sûr à 100%, mais je pense que cela résoudrait votre problème http://code.alexreisner.com/articles/single-table-inheritance-in-rails.html

Si ce n'est pas bon, ce n'est pas trop difficile à implémenter.

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

Vous devriez être capable de faire ce que vous voulez avec une association polymorphe. Cela ne va pas allumer cindof par défaut, mais cela ne peut pas être un problème.

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 

Vous aurez besoin à la fois une colonne account_id et une colonne account_type. Le type de l'objet de compte est ensuite stocké dans la colonne de type supplémentaire.

Cela vous permettra de le faire:

obj.account = AccountPage.new 

ou

obj.account = AccountSite.new 
Questions connexes