我有以下两种模式。他们可以解释如下: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