Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 接受\u嵌套的\u属性\u和二阶关联、嵌套形式_Ruby On Rails_Nested Forms_Nested Attributes - Fatal编程技术网

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