我在下面有两个模型。它们可以解释如下:
报告有一个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 的索引有一个唯一约束 [:duration, :starting_month, :offset]
我要完成的是:如果一个新报告的 ReportDetail 具有唯一的组合 attrs (:duration, :starting_month, :offset),则创建新的 ReportDetail 并正常保存。如果报表具有 ReportDetail,而现有 ReportDetail 具有相同的属性,则将报表的详细信息与此 ReportDetail 相关联并保存报表。
我通过在report_detail=
使用 a时为 setter 设置别名来实现这一点,ReportDetail.find_or_create_by...
但它很丑陋(而且它还通过使用 detail 属性实例化新报告来创建不必要的 ReportDetail 条目,并且由于某种原因,我无法使用 来使保存正常工作.find_or_initialize_by...
)。我还尝试before_save
在 ReportDetail 上说,如果我匹配其他内容,则设置self
为其他内容。显然你不能这样设置自己。
对解决此问题的最佳方法有任何想法吗?
请参阅此要点以了解我当前使用别名覆盖的设置器