Rails在百货商店模式中嵌套属性而不是自动保存外键

时间:2012-12-18 15:54:18

标签: activerecord ruby-on-rails-3.2

在以下“百货商店模式”中,我有三种模式:

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

然后该项目与商店无关。

我对此问题的解决方案是将以下内容添加到Item模型中:

class Item
  before_validation :capture_store_info
  def capture_store_info
    self.store = self.department.store
  end

我将它添加到before_validation回调中,因为在我的非平凡代码中,我有一堆验证,包括检查商店模型是否存在的验证。

问题:我的解决方案有效,但是解决这个问题的方法是正确的(即Rails常规方法)吗?有没有更好的解决方案。这感觉有点脏,每次我在Rails中做了一些感觉“有点脏”的东西,它后来又回来咬我了。

谢谢, JB

0 个答案:

没有答案