1

在嵌套模型和表单字段的上下文中,在创建父项和输入子项的值(大小)时,目标是对子项的值应用条件以确定后续值(product_id),所有这些都在创建中父母行动

class QuoteItem < ActiveRecord::Base
  belongs_to :quote, :inverse_of => :quote_items
  belongs_to :product

class Quote < ActiveRecord::Base
  has_many   :quote_items, :inverse_of => :quote

这不能预先作为模型方法执行,因为模型不知道参数。尝试为 QuoteItem 定义 after_create 回调

  after_create :set_product 
  def set_product
    @quote_item.product_id = Product.where(['min <= ? AND max >= ?', @quote_item.size, @quote_item.size]).first.select[:id]    
  end

不注册产品 ID。

更简洁的方式可能是通过控制器重新加载数据。动作创建

   respond_to do |format|
      if @quote_item.save
        set_product
        @quote_item.update_attribute([:quote_item][:product_id])
        format.html { redirect_to @quote_item, notice: 'Quote item was successfully created.' }

具有相同的 NIL 结果

4

1 回答 1

2

该解决方案实际上在 after_create 中是可能的。在嵌套模型中,创建后更新属性

  after_create :set_product  

private

  def set_product
    product_id = Product.where(['min <= ? AND max >= ?', self.size, self.size]).first.id
    update_attributes(:product_id => product_id)
  end
于 2013-05-25T21:21:04.093 回答