[英]Easiest way to edit associations in Rails
我有我认为必须是常见的情况,但可能无法找到解决问题的方法来获得解决方案......
我的应用程序中有几个链接的模型:
class Product < ActiveRecord::Base
validates_uniqueness_of :prod_code
end
class Stock < ActiveRecord::Base
belongs_to :product
end
事实上,还有许多其他型号也属于产品。 默认情况下,在库存记录中,我只看到product_id字段,这是一个自动递增的数字,对用户没什么帮助。 产品具有独特的prod_code
,条形码等,是产品数据库的自然关键。
我想要的是股票和其他链接模型的创建/编辑屏幕,以显示prod_code的文本字段,并能够以合理的方式响应stock[prod_code]
形式的参数(例如,查找prod_code,并根据结果设置prod_id),并自动(例如Stock.new(params[:stock])
应该有效。
为了澄清,设置stock [prod_code]不会改变产品数据库中的任何内容; 它会改变相关库存记录的product_id,即将库存记录链接到不同的产品记录。
目前,我已经在股票模型中定义了各种方法,例如prod_code=
,这使得这项工作成为可能。 但正如我所提到的,实际上有多个模型会引用我的产品表。 有什么办法可以在Product模型中定义一些东西吗?
例如,像referenced_by方法那样会通过在products表中查找来告诉所有链接模型处理prod_code
参数?
class Product < ActiveRecord::Base
validates_uniqueness_of :prod_code
referenced_by :prod_code
end
您可能想要使用的是嵌套表单。
首先,您可以告诉您的模型接受嵌套属性(嵌套属性的api ),例如
accepts_nested_attributes_for :product
在您的库存模型中。
然后在表单中,您可以使用fields_for( api for fields_for )将产品字段嵌套到库存表单中。 想象一下:
= form_for(@stock) do |form|
= form.text_field :some_stock_attribute
= form.fields_for(@stock.product) do |product_form|
= product_form.text_field :prod_code
这基本上将您的prod_code表单字段的名称嵌套到“stock [product_attributes] [prod_code]”,而由于accepted_nested_attributes_for,您的库存模型准备将product_attributes传递给关联的产品。
您想象的referenced_by方法不存在。 此外,您还需要处理更多,然后只需更改相关产品。 如果prod_code不存在,我仍然想要显示错误,我假设。
粗略地说,您可以为库存添加虚拟属性,这允许您的库存表单具有text_field:prod_code(将attr:prod_code添加到库存模型)。
其次,在验证之前,您可能需要一个方法,为prod_code查找产品,并更改关联,或在:prod_code上添加错误。
这可能看起来像这样:
class Stock
attr :prod_code
before_validation :associate_product_from_prod_code
def associate_product_from_prod_code
unless self.product = Product.where(:prod_code => prod_code)
errors[:prod_code] << "Product Code is not valid"
end
end
end
您可以使用prod_code而不是product_id作为foreign_key:
class Stock
belongs_to :product, :foreign_key => "prod_code"
end
或者您可以在产品上进行设置:
class Product
has_many :stocks, :foreign_key => "prod_code"
has_many :images, :foreign_key => "prod_code"
has_many :sizes, :foreign_key => "prod_code"
end
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.