我有以下兩種模式。他們可以解釋如下:ActiveRecord關聯:如果關聯屬性匹配,則創建新的關聯或引用
報告有一個report_detail(它決定開始/結束月份)。許多報告可以具有相同的報告細節,但沒有兩個報告細節可以相同。
class Report < ActiveRecord::Base
# attr: name :: String
# attr: report_detail_id :: Integer
belongs_to :report_detail
accepts_nested_attributes_for :report_detail
end
class ReportDetail < ActiveRecord::Base
# attr: duration :: Integer
# attr: starting_month :: Integer
# attr: offset :: Integer
end
我有關於ReportDetail索引的唯一約束[:持續時間:starting_month,:偏移]
我試圖做到這一點是:如果一個新的報告ReportDetail有一個獨特的組合attrs(:duration,:starting_month,:offset),創建新的ReportDetail並保存爲正常。如果報告具有ReportDetail,現有的ReportDetail具有相同的屬性,請將報告的詳細信息與此ReportDetail關聯並保存報告。
我得到這個由走樣二傳手上report_detail=
使用ReportDetail.find_or_create_by...
工作,但它的醜陋(它也只是通過實例化與細節的屬性創建新報告創建不必要ReportDetail項,出於某種原因,我無法得到保存使用.find_or_initialize_by...
正常工作)。我還在ReportDetail上嘗試了before_save
來說,如果我匹配其他內容,請將self
設置爲其他值。顯然你不能像這樣設置自我。
任何思考最好的方式去做這件事?
看到this gist我現在的二傳與別名
你可以發佈別名代碼嗎?也許作爲一個要點,並把它連接到這裏。這聽起來像是在正確的軌道上,但可能有一兩個錯誤。加入了 – 2010-09-14 19:03:37
......這段代碼沒有錯誤,它都可以工作,但我正在尋找更好的解決方案。我最大的興趣是,當你使用上面的要點進行初始化時,它實際上會創建一個ReporDetail。我也無法使它與find_or_initialize_by正常工作,因爲關聯的保存意味着在此之前發生,所以它不會最終保存關聯第一次去 – brad 2010-09-14 20:36:14