Ruby on rails 如何使用联接表显示元素列表

Ruby on rails 如何使用联接表显示元素列表,ruby-on-rails,ruby,has-many-through,Ruby On Rails,Ruby,Has Many Through,我有三个表,其中一个是多对多关系表: class Category < ApplicationRecord has_many :categorizations has_many :products, :through => :categorizations end class Product < ApplicationRecord has_many :categorizations, dependent: :destroy has_many :categori

我有三个表,其中一个是多对多关系表:

class Category < ApplicationRecord
  has_many :categorizations
  has_many :products, :through => :categorizations
end

class Product < ApplicationRecord
  has_many :categorizations, dependent: :destroy
  has_many :categories, :through => :categorizations
end
在new.html.erb中:

  <% Category.all.each do |category| %>
   <label>
      <%= check_box_tag "product[category_ids][]", category.id, field.object.categories.include?(Category) %>
      <%= category.name_category %>
   </label>
  <%end%>

我无法显示类别名称。在show.html.erb中,我尝试了一切,但它只显示产品所属类别的ID


如何显示类别名称?在数据库中,我可以进行
连接
,但在RubyonRails中,这很困难

在Rails中无法将关系存储在数组列中。您可以加载必要的
类别
,并通过
类别id
进行访问

# for single product
category_ids = product.category_ids
# for many products
category_ids = products.flat_map(&:category_ids)

# load categories
categories = Category.where(id: category_ids).index_by(&:id)
# the result structure 
# {1 => #<Category id: 1, ...>, 2 => #<Category id: 2, ...> ... }

# now all related categories preloaded
products.each do |product|
  product.category_ids.each do |category_id|
    puts categories[category_id]
  end
end
单个产品的
#
类别\标识=产品类别\标识
#对于许多产品
类别ID=产品。平面地图(&:类别ID)
#负荷类别
类别=类别。其中(id:Category\u id)。索引人(&:id)
#结果结构
# {1 => #, 2 => # ... }
#现在所有相关类别都已预加载
产品。每个do |产品|
product.category_id.每个do| category_id|
放置类别[类别\u id]
结束
结束

什么是扇区?您的
new.html.erb
代码与问题中的其余信息无关。“在数据库中,我可以进行连接…”。是的,这可能是正确的做法。当DBM能够进行筛选和处理工作时,您希望避免移动大量数据和让Ruby或Rails承担繁重的工作。我见过在Ruby中数据移动和处理需要几秒钟的任务,DBM搜索、筛选和处理需要几秒钟,然后只返回所需的记录。这将减少应用程序或web服务器上的网络负载和CPU负载。
  <% Category.all.each do |category| %>
   <label>
      <%= check_box_tag "product[category_ids][]", category.id, field.object.categories.include?(Category) %>
      <%= category.name_category %>
   </label>
  <%end%>
# for single product
category_ids = product.category_ids
# for many products
category_ids = products.flat_map(&:category_ids)

# load categories
categories = Category.where(id: category_ids).index_by(&:id)
# the result structure 
# {1 => #<Category id: 1, ...>, 2 => #<Category id: 2, ...> ... }

# now all related categories preloaded
products.each do |product|
  product.category_ids.each do |category_id|
    puts categories[category_id]
  end
end