【问题标题】:Accessing proper array value访问正确的数组值
【发布时间】:2014-12-19 09:15:14
【问题描述】:

以下数组["2", "8", "134", "137", "140"] 是通过用户输入生成的。控制器操作调用数组如下:

params[:product_ids].each do |product_id|
  @product = Product.where('id = ?', product_id).first
end 

不幸的是在视图中调用值时(出于开发控制目的)

<% params[:product_ids].each do |t| %>
  <%= t %> <%= @product.id %><br />
<% end %>

正在为t 呈现正确的值,但随后将其与140 关联五次。

2 140
8 140
134 140
137 140
140 140

因此访问数组的最后一项并忽略键。当在控制器中尝试这样做时:

params[:product_ids].each do |k, product_id|

它正在返回Called id for nil, which would mistakenly be 4 -- if you really wanted the id of nil, use object_id

如何定义控制器以适当地访问参数的值?

【问题讨论】:

    标签: ruby-on-rails ruby arrays


    【解决方案1】:

    您将循环中的值分配给同一个变量,将其放在循环之外,并使用#map 获取值作为所有产品 ID 的事务模型,因此:

    @transactions = params[:product_ids].map do |product_id|
       [ Transaction.where(product_id: product_id).first ]
    end
    

    然后:

    <%= @transactions %>
    

    【讨论】:

    • @Malo。此语法确实会生成数据。令我惊讶的是&lt;%= @products %&gt; 返回了["2", #&lt;Product id: 2, struttura_id: 1, [...] ["8", #&lt;Product id: 8, struttura_id: 1, 等。换句话说,值,然后是对象的数据。然后,如果我想遍历每个并创建新记录 @products.each do |product| params[:transaction][:product_id] = product.id @transaction = Transaction.new(params[:transaction] 我不能,因为这是访问数组...
    • @Jerome 好吧,你想得到什么? =)
    • @Malo 产品的 id... 但我相信我的推理陷入了一个循环陷阱。使用params[:product_ids].each do |product_id| params[:transaction][:product_id] @transaction = Transaction.new(params[:transaction] 会更直接...
    • @Jerome 你想买什么产品?
    • 每个参数一个事务[:product_id]
    【解决方案2】:

    在这段代码中:

    params[:product_ids].each do |product_id|
      @product = Product.where('id = ?', product_id).first
    end
    

    您正在更新 @product 实例变量 n 次(其中 n 是 params[:product_ids] 表的大小)。最后,@product 实例变量持有Product,其 id 是params[:product_ids] 的最后一个元素,在您的情况下是140。我想如果你设置 products 数组会更好,像这样:

    @products = Product.where(id: params[:product_ids])
    

    所以你可以遍历它们:

    <% @products.each do |product| %>
      <%= product.id %>
    <% end %>
    

    【讨论】:

    • 这个语法Product.where(id: params[:product_ids]) 正确吗?我以前没遇到过?
    • @Jerome 是正确的。它使用IN 子句生成 SQL。
    • 这是生成Product Load (2.7ms) SELECT "products".* FROM "products" WHERE "products"."id" IS NULL 并且只生成一次...(postgresql 是 db)
    • @Jerome 所以你的params[:product_ids] 可能是nil
    • 并非如此。 &lt;%= params[:product_ids] %&gt; 返回 ` ["2", "8", "134", "137", "140"] `
    【解决方案3】:

    当你使用

    params[:product_ids].each do |product_id|
      @product = Product.where('id = ?', product_id).first
    end 
    # you set @product = 2
    # @product = 8
    # ...
    # @product = 140  last value of @product is 140
    

    解决方案

    @products = params[:product_ids].map do |p_id|
       {p_id => Product.find_by(id: p_id)}    
    end
    

    在你看来

    <% @products.each do |k, v| %>
      <%= k %> <%= v %><br />
    <% end %>
    

    【讨论】:

    • Product.find_by(p_id) 不起作用。它应该是Product.find_by(id: p_id)Product.find_by_id(p_id)
    • 不,没有列名的find_by 的行为不像find_by(id: p_id),至少在4.1.6 中。
    • 你说得对,我没仔细看,它从数据库返回第一个对象
    • ... 或者只是引发错误,例如如果您使用 postgresql。
    猜你喜欢
    • 1970-01-01
    • 2014-08-16
    • 2015-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多