0

我有一些類在Rails 2應用程序:a Group有一些group_items。每個group_item具有多態性ìtemusercontact覆蓋has_many <<功能

class Group < AR::Base 
    has_many :group_items 
    has_many :users, :through => :group_items 
    has_many :contacts, :through => :group_items 
end 

class GroupItem < Ar::Base 
    belongs_to :group 
    belongs_to :item, :polymorphic => true 
    belongs_to :users :conditions => 
     [ "#{GroupItem.table_name}.item_type = ? ", User.to_s ], 
     :foreign_key => 'item_id' 
    belongs_to :contacts :conditions => 
     [ "#{GroupItem.table_name}.item_type = ? ", Contact.to_s ], 
     :foreign_key => 'item_id' 
    validates_presence_of :group_id, :item_id, :item_type 
end 

一切正常。不過,我將能夠使用此功能:

@my_group.users << @my_user 
@my_group.contacts << @my_contact 

的關聯似乎過於複雜,這樣做:

ActiveRecord::RecordInvalid for GroupItem: item_type must be filled 

有沒有辦法使用此功能,如覆蓋Groupusers<<功能?

問候

回答

0

我發現了一個漂亮的解決方案,使用協會擴展

has_many :users, :through => :group_items do 
    def <<(user) 
    group_item = proxy_owner.group_items.create({ :item => user }) 
    return false if !group_item.valid? 
    return proxy_target 
    end 
end 
+0

覺得尷尬對我說:如果項目沒有通過驗證,你甚至不能訪問它,看看錯誤 – apneadiving

+0

@ apneadiving它只是具有與原始'<<'相同的行爲,當item不能被插入時它返回false。 – pierallard