Ruby on Rails在保存之前通过关联对象具有很多功能

Nic*_*ick 9 ruby ruby-on-rails has-many-through

在Ruby on Rails项目上,我试图在将所有内容保存到数据库之前访问ActiveRecord上的关联对象.

class Purchase < ActiveRecord::Base

  has_many :purchase_items, dependent: :destroy
  has_many :items, through: :purchase_items

  validate :item_validation

  def item_ids=(ids)
    ids.each do |item_id|
      purchase_items.build(item_id: item_id)
    end
  end

  private

  def item_validation
    items.each do |item|
      ## Lookup something with the item
      if item.check_something
        errors.add :base, "Error message"
      end
    end
  end

end
Run Code Online (Sandbox Code Playgroud)

如果我像这样构建我的对象: purchase = Purchase.new(item_ids: [1, 2, 3])并尝试保存它,item_validation方法没有填充项目集合,所以即使已设置项目设置,它也没有机会check_something在其中任何一个上调用方法.

是否可以在我的购买模型和关联模型持久化之前访问项目集合,以便我可以对它们运行验证?

如果我改变我的item_validation方法是:

def item_validation
  purchase_items.each do |purchase_item|
    item = purchase_item.item
    ## Lookup something with the item
    if item.something
       errors.add :base, "Error message"
    end
  end
end
Run Code Online (Sandbox Code Playgroud)

它似乎按照我想要的方式工作,但是我发现很难相信在我购买之前没有办法直接访问带有rails的items集合,并且相关记录被保存到数据库中.

小智 0

您有文件表明purchase = Purchase.new(item_ids: [1, 2, 3])符合您的预期?

在我看来,您只是将非数据库属性“item_ids”设置为数组(即不创建关联)。

您的购买模型甚至不应该有任何可以直接设置的外键列。相反,表中的条目purchase_items带有purchase_iditem_id。要在您的购买和这三个项目之间创建链接,您需要在连接表中创建三个条目。

如果你这样做会发生什么?:

purchase = Purchase.new
purchase.items = Item.find([1,2,3]) 
Run Code Online (Sandbox Code Playgroud)