Rails:在从相关表收集数据的同时使用丰富的联接表

时间:2019-02-05 18:33:28

标签: ruby-on-rails

请原谅我。
我搜索了一段时间,我怀疑我是在问一个错误的问题,因此得到了“错误”的答案

我有一个带有3个控制器的Rails项目,具有相应的视图和一个模型
我为他们准备了足够的路线,并且可以对每个路线执行CRUD
-卡
-套装
-JoinCardSets

它们的数据库架构为:

表名:卡片

id
cardName
description
imageUrl

表格名称:套

id
setName
description
imageUrl

表格名称:join_card_sets

id
card_id
set_id
no_of_cards

卡和套之间有很多关系,因此我的模型如下所示:

class Card < ApplicationRecord

  has_many :join_card_sets
  has_many :sets, :through => :join_card_sets

end


class Set < ApplicationRecord

  has_many :join_card_sets
  has_many :cards, :through => :join_card_sets

end

class JoinCardSet < ApplicationRecord

  belongs_to :set
  belongs_to :card

end

当我导航到CardsController#Show

显示:
卡名,
说明,
并通过联结表将与之链接的集合用于一些rails magic

控制器:

def show
    @mtg_card = Card.find(params[:id])
    @current_sets = @mtg_card.mtg_sets
end

“显示”视图:

<h2><%= @card.name %></h2>
<%= @card.description %><br>
<img src="<%= @card.imageUrl %>" alt="<%= @card.name %>"><br>

<% if @current_sets.present?
  @current_sets.each do |t| %>
   <%= t.name %>: <%= %>
  <% end #end of for each loop current_set |t| %>
<% end #end of if statment %>

我需要以下方面的帮助:
当@current_sets遍历每个连接时,
我希望它显示“ no_of_cards”列,并将其与卡集名称一起显示。

如果不清楚,或者您知道答案在哪里,请告诉我

1 个答案:

答案 0 :(得分:1)

使用ActiveRecord的技巧是在关联的网络中找到正确的点,以使您正在迭代的对象本身具有足够的信息以供查看,或者具有可遍历的关联以获取该信息。模式中的Set对象具有许多card_join_sets,因此无法获取单个相关的“ no_of_cards”。 JoinCardSet对象只有一个集合,因此很容易获得相关集合来获取名称。

在控制器中:

    @current_join_sets = @mtg_card.join_card_sets

然后在您看来:

 @current_join_sets.each do |t| %>
   <%= t.set.name %>: <%= t.no_of_cards %>
  <% end #end of for each loop current_set |t| %>

(在实际代码中,这里还有更多要清理的地方。t.set.name破坏了Law of demeter,您应该急于加载数据,但这在这个问题上是不切实际的。)