0

У меня есть несколько классов в Rails 2 приложение: a Group есть некоторые group_items. Каждый group_item имеет полиморфный ìtem: user или contact.Переопределение 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. Это просто одно и то же поведение, чем исходный '<<', который возвращает 'false', когда элемент не может быть вставлен. – pierallard

Смежные вопросы