以下の2つのモデルがあります。それらは次のように説明できます。
レポートには report_detail (開始/終了月を決定する) があります。多くのレポートは同じレポート詳細を持つことができますが、2 つのレポート詳細が同じであることはできません。
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
[:duration, :starting_month, :offset] の ReportDetail のインデックスに一意の制約があります。
私が達成しようとしているのはこれです: 新しいレポートに、一意の組み合わせ属性 (:duration、:starting_month、:offset) を持つ ReportDetail がある場合、新しい ReportDetail を作成し、通常どおり保存します。レポートに ReportDetail があり、既存の ReportDetail が同じ属性を持つ場合、レポートの詳細をこの ReportDetail に関連付け、レポートを保存します。
report_detail=
a を使用してセッターにエイリアスを設定することでこれを機能させましたReportDetail.find_or_create_by...
が、醜いです (また、detail 属性を使用して新しいレポートをインスタンス化するだけで不要な ReportDetail エントリが作成され、何らかの理由で を使用して保存を適切に機能させることができませんでした.find_or_initialize_by...
)。またbefore_save
、ReportDetail で、何か他のものと一致する場合は、他のものに設定しようとしましたself
。どうやらあなたはそのように自分自身を設定することはできません。
これについて最善の方法について何か考えはありますか?
私の現在のセッターがエイリアスで上書きするためのこの要点を参照してください