1

次の「デパートパターン」には、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

4

0 に答える 0