Ruby on rails 接受\u嵌套的\u属性\u和二阶关联、嵌套形式
我有以下关联模型:Ruby on rails 接受\u嵌套的\u属性\u和二阶关联、嵌套形式,ruby-on-rails,nested-forms,nested-attributes,Ruby On Rails,Nested Forms,Nested Attributes,我有以下关联模型: class Order < ActiveRecord::Base has_many :guests has_many :customers, :through => :guests accepts_nested_attributes_for :customers end class Customer < ActiveRecord::Base has_many :guests has_many :orders, :through =&
class Order < ActiveRecord::Base
has_many :guests
has_many :customers, :through => :guests
accepts_nested_attributes_for :customers
end
class Customer < ActiveRecord::Base
has_many :guests
has_many :orders, :through => :guests
has_many :slips
accepts_nested_attributes_for :slips
end
class Slip < ActiveRecord::Base
belongs_to :order
belongs_to :customer
end
class Guest < ActiveRecord::Base
belongs_to :order
belongs_to :customer
end
类顺序:客人
接受客户的\u嵌套\u属性\u
结束
类Customer:客人
你有很多错误吗
接受以下内容的\u嵌套\u属性\u:slips
结束
类Slip
我的嵌套表单如下所示:
<!-- general form -->
<%= form_for(@order) do |f| %>
<% f.fields_for :customers do |builder| %>
<%= render "customer_fields", :f => builder %>
<% end %>
<%= f.submit %>
<% end %>
<!-- partial customer_fields -->
<p>
<%= f.label :name%><%= f.text_field :name %>
<% f.fields_for :slips do |builder| %>
<%= render "slip_fields", :f => builder %>
<% end %>
</p>
<!-- partial slip_fields -->
<p><%= f.label :quantity%><%= f.text_field :quantity %></p>
建筑商%>
建筑商%>
通过此设置,保存订单可以按预期工作,但我需要将订单id与单据一起保存,因此我在订单单据之间有一个参考。通过这种设置,我失去了参考。我可以获取所有关联的客户,但我将获取与订单相关或不相关的客户的所有关联单据
以下是我的模型的字段: 订单->id
客户->id
来宾->标识、订单标识、客户标识
单据->id,订单id,客户id
订单的结果应该如下所示
- 订单
- 顾客A
- 单张1
- 滑条2
- 顾客B
- 单张1
- 滑条2
- 顾客A
- 单张1
- 滑条2
- 滑条3
我不知道如何做到这一点。只要你不能返回
order\u id
对于不存在的订单,你可以做这个钩子(我还没有测试它,所以你可能需要修复它)
此外,您最好将所有这些逻辑删除到您的模型中,然后可以将其稍微干燥一点。这只是关于理解一种方法
UPD用于您的ID冲突。这又只是一个权杖
def create
customers = params[:order].delete :customers_attributes
@order = Order.new params[:order]
@order.customer_ids = customers.inject([]){|a,h| a << h[:b] if h[:b]; a}
if @order.save
customers.each{|c| c[:slips_attributes].each{|s| s[:order_id] = @order.id} }
@order.customers_attributes = customers
@order.save
end
end
def update
@order = Order.find params[:id]
@order.customer_ids = params[:order][:customers_attributes].inject([]){|a,h| a << h[:b] if h[:b]; a}
params[:order][:customers_attributes].each{|c| c[:slips_attributes].each{|s| s[:order_id] = @order.id} }
@order = Order.update_attributes params[:order]
@order.save
end
def创建
customers=params[:order]。删除:customers\u属性
@订单=订单。新参数[:订单]
@order.customer\u id=customers.inject([]){| a,h | a我可以想象如何在exist@order中实现它,但是对于新的order它是非常复杂的。你可以在嵌套资源中使用老式的虚拟属性,而不是现代的接受嵌套的属性
这里可能有一个钩子,我可以将order\u id传递给slip模型?我添加了一个注释来解释solutionPerfect,这很有效虽然我不得不更改:customers.each{c|c[:slips|u attributes].each{s|s[:order|id]=@order.id}给我的是customers.values.each{c|c[:slips|u attributes].value.each{s{s|s|order|id]=@order.id}现在清理控制器并干燥方法。将所有这些内容删除到模型:)Thx,是的,我会尝试。现在我遇到另一个错误:如果我尝试添加现有客户,我会收到以下消息:ActiveRecord::RecordNotFound(对于ID=7的订单,找不到ID=1的客户):如果我尝试添加一个现有客户,您的意思是什么?您有一个选择字段来选择客户或什么?请尝试深入了解接受
magick的嵌套属性下的内容:
def create
customers = params[:order].delete :customers_attributes
@order = Order.new params[:order]
@order.customer_ids = customers.inject([]){|a,h| a << h[:b] if h[:b]; a}
if @order.save
customers.each{|c| c[:slips_attributes].each{|s| s[:order_id] = @order.id} }
@order.customers_attributes = customers
@order.save
end
end
def update
@order = Order.find params[:id]
@order.customer_ids = params[:order][:customers_attributes].inject([]){|a,h| a << h[:b] if h[:b]; a}
params[:order][:customers_attributes].each{|c| c[:slips_attributes].each{|s| s[:order_id] = @order.id} }
@order = Order.update_attributes params[:order]
@order.save
end