次の「デパートパターン」には、3つのモデルがあります。
class Store
has_many :items, inverse_of: :store, autosave: true
has_many :departments, inverse_of: :store, autosave: true
accepts_nested_attributes_for :departments, allow_destroy: true
class Department
belongs_to :store, inverse_of: :departments
has_many :items, autosave: true, inverse_of: department
accepts_nested_attributes_for :items, allow_destroy: true
class Item
belongs_to :store, inverse_of: :items
belongs_to :department, inverse_of: :items
私が次のことを試してみると:
store = Store.new
department = store.departments.build
item = department.items.build
store.save
その場合、アイテムはストアに関連付けられません。
この問題に対する私の解決策は、アイテムモデルに以下を追加することでした。
class Item
before_validation :capture_store_info
def capture_store_info
self.store = self.department.store
end
これをbefore_validationコールバックに追加しました。これは、重要なコードに、ストアモデルの存在をチェックするものを含む、多数の検証があるためです。
質問:私の解決策は機能しますが、この問題を解決する正しい(つまり、従来のRails)方法ですか?より良い解決策はありますか?これはちょっと汚い感じがします、そして私が「ちょっと汚い」と感じたRailsで何かをするたびに、それは後で私を噛むために戻ってきました。
ありがとう、JB