我有三个型号。具有任务产品的嵌套属性的任务,以及具有预先填充的产品的单独的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>
答案 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 %>