2009-07-15 27 views
1

我有一個基本的has_many:通過關係是雙向的:bulk has_many的默認代碼是什麼:通過在rails中的連接賦值?

calendars have many calendar_calendar_events 
calendars have many events through calendar_calendar_events 


events have many calendar_calendar_events 
events have many calendars through calendar_calendar_events 

我想日曆分配到的基本calendar_ids=功能的事件HAS_MANY:通過設置,但是,我想重寫這個函數來添加一些額外的魔法。我查看了rails的源代碼,找不到這個函數的代碼。我想知道是否有人可以指給我。然後我會重寫它爲該類補充一點,我想要的東西:)

回答

2

您可以在行1295

def collection_accessor_methods(reflection, association_proxy_class, writer = true) 
     collection_reader_method(reflection, association_proxy_class) 

     if writer 
     define_method("#{reflection.name}=") do |new_value| 
      # Loads proxy class instance (defined in collection_reader_method) if not already loaded 
      association = send(reflection.name) 
      association.replace(new_value) 
      association 
     end 

     define_method("#{reflection.name.to_s.singularize}_ids=") do |new_value| 
      ids = (new_value || []).reject { |nid| nid.blank? } 
      send("#{reflection.name}=", reflection.class_name.constantize.find(ids)) 
     end 
     end 
    end 

你一定要避免這樣的重寫這個方法來增加魔法的東西找到文件lib/active_record/associations.rb的源代碼。有時候Rails已經「太神奇了」。我建議創建所有自定義邏輯虛擬屬性有以下幾個原因:

  1. 其他一些軌道的方法可能依賴默認的實現
  2. 你依靠,可能會在未來的ActiveRecord更改特定API版本
+0

這是一個很好的觀點。在我的示例中,我剛剛在我的事件模型中覆蓋了日曆=方法。這還不好嗎?是否有可能鏈接這些方法?我從來沒有做過,但我已經看到了一點。我想要做的就是在必要的情況下將一個額外事件添加到日曆=參數上的new_value事件數組中。 – 2009-07-15 22:47:33

0

作爲對上述答案的迴應,我使用alias_method_chain來覆蓋默認設置器並添加我的特性。工作得很好,但我不知道爲什麼我必須發送方法setter,而不是正常使用它。它似乎沒有工作,雖然所以這會做:)

def calendars_with_primary_calendar=(new_calendars) 
    new_calendars << calendar unless new_record? 
    send('calendars_without_primary_calendar=', new_calendars) # Not sure why we have to call it this way 
    end 

    alias_method_chain :calendars=, :primary_calendar