使用外部模型详细信息循环嵌套属性

时间:2017-01-31 22:25:42

标签: ruby-on-rails activerecord

这里有三个月的Ruby on Rails初学者,所以如果我的任何术语不正确,我会道歉。我有一个关于从嵌套属性引用外部模型的问题。

我有三个型号。具有任务产品的嵌套属性的任务,以及具有预先填充的产品的单独的Items表。

每个任务都有许多任务产品,任务产品有一个“product_id”列,该列引用了Item表中的现有产品。在创建每个任务的表索引时,我无法弄清楚如何让嵌套的Task Product的product_id列出Item而不仅仅是bare id。

这是我正在使用的代码:

tasks_controller.rb - >

def dashboard
  @tasks = Task.includes(:task_products, :storeorder).last(100)
  @tasks.each do |task|
    task.storeorder do |storeorder|
    end
    task.task_products.each do |task_product|
      @item = Item.where(:id => task_product.product_id)
    end
  end
end

task.rb - >

class Task < ApplicationRecord
  has_many :task_products
  accepts_nested_attributes_for :task_products
end

task_product.rb - &gt;

class TaskProduct < ApplicationRecord
  belongs_to :task
  has_many :items
end

item.rb - &gt;

class Item < ActiveRecord::Base
  belongs_to :task_product

  def item_select
    "#{vendor_name} (#{description})"
  end
end

dashboard.html.erb - &gt;

<td>
  <% t.task_products.each do |tp| %>
    # Existing code that lists each task product in a list on the table:
    <p><%= tp.product_id %></p>
    # The ideal code I would like to run:
    <p><%= link_to @item.item_select, item_path(id: @item.id) %>
  <% end %>
</td>

我是如何运行@item调用的,因为它与html文件中的'tp.product_id'代码有关?

感谢我能得到的任何帮助。搜索这个问题给我留下了许多紫色链接,但没有一个解决这个问题。

编辑:如果有人遇到与我相同的困境,我有一个建议:了解你的联想。

更新的代码:

tasks_controller.rb - &gt;

def dashboard
  @tasks = Task.includes(:task_products, :storeorder).last(100)
end

task.rb - &gt;

class Task < ApplicationRecord
  has_many :task_products
  accepts_nested_attributes_for :task_products
end

task_product.rb - &gt;

class TaskProduct < ApplicationRecord
  belongs_to :task
  belongs_to :item, foreign_key: :product_id
end

item.rb - &gt;

class Item < ActiveRecord::Base
  has_many :task_products, foreign_key: :product_id

  def item_select
    "#{vendor_name} (#{description})"
  end
end

dashboard.html.erb - &gt;

        <td>
          <% t.task_products.each do |tp| %>
            <% tp.items.each do |item| %>
              <p><%= link_to item.item_select, item_path(item) %></p>
            <% end %>
          <% end %>
        </td>

2 个答案:

答案 0 :(得分:0)

我没有看到dashboard_controller.rb中所有循环的需要

@tasks.each do |task|
  task.storeorder do |storeorder|
end
task.task_products.each do |task_product|
  @item = Item.where(:id => task_product.product_id)
end
end

这是你在html.erb中需要的东西:

# The ideal code I would like to run:
<% tp.items.each do |item| %>
  <p><%= link_to item.item_select, item_path(item) %>
<% end %>

答案 1 :(得分:0)

首先,通过在控制器中使用Item.where,您实际上是将@item设置为项目的集合。其次,通过在循环中设置它,您将使用每个TaskProduct覆盖它,因此在视图中只有最后一个将是准确的。

我假设您要为每个任务列出每个项目的子集。在这种情况下,你最好不要在控制器中设置它们:

def dashboard
  @tasks = Task.includes(:task_products, :storeorder).last(100)
end

相反,只需在视图中循环它们:

<% @tasks.each do |t| %>
  Task <%= t %>
  <% t.task_products.each do |tp| %>
    TaskProduct <%= tp %>
    <% tp.items.each do |item| %>
      <p><%= link_to item.item_select, item_path(item) %></p>
    <% end %>
  <% end %>
<% end %>