试图弄清楚如何将大量逻辑从视图移动到控制器/模型中。
(我认为它应该进入模型?)
Show.html.erb
<div class="collectionList">
<% @user.collections.each do |d| %>
<%= d.name %>
Distinct Cards: <%= d.card_collections.count %> <br />
Total Cards:
<% d.card_collections.each do |x| %>
<% y = [] %>
<% y << x.card_counts %>
<% y.flatten! %>
<% y = y.inject(0){|sum,x| sum + x } %>
<%= y %>
<% end %>
<% if d.public %> Public <% end %><br />
<% end %>
</div>
每个用户都有一个集合,每个集合都可以有一个card_collection,每个集合都可以有一张卡片。
'card_collections'的数量是您牌组中不同牌的数量。 “card_collections.card_counts”的总和是卡的总数。我想如果我把它定义为模型中的“卡片总数”和“卡片数”,我可以这样称呼它,但我不确定如何。
我还认为如果我可以将其移入模型中,我的逻辑会更容易,因为我可以使用pluck / sum来更快地获得结果吗?
集合
class Collection < ApplicationRecord
belongs_to :user
has_many :card_collections
has_many :cards, through: :card_collections
# validates :user_id, presence: true
end
卡
class Card < ApplicationRecord
has_many :card_collections
has_many :collections, through: :card_collections
belongs_to :deck, optional: true
end
CardCollection
class CardCollection < ApplicationRecord
belongs_to :collection
belongs_to :card
end
答案 0 :(得分:0)
在这里,只需在控制器中添加以下代码:
@user = User.joins(:collections).where("ANY CONDITION").select("*,count(collections.id) as card_collections_count, sum(collections.card_counts) as card_counts")
在您的视图文件中
<div class="collectionList">
<% @user.each do |d| %>
<%= d.name %>
Distinct Cards: <%= d.card_collections_count %> <br />
Total Cards: <%= d.card_counts %>
<% if d.public %> Public <% end %><br />
<% end %>
</div>
快乐编码!!
答案 1 :(得分:0)
您可以在CardCollection
模型上执行此操作
class CardCollection < ApplicationRecord
belongs_to :collection
belongs_to :card
def sum_of_cards
y = []
y << self.card_counts
y.flatten!
y = y.inject(0) { |sum, self| sum + self }
return y
end
end
然后在你的视图中调用它
<div class="collectionList">
<% @user.collections.each do |d| %>
<%= d.name %>
Distinct Cards: <%= d.card_collections.count %> <br />
Total Cards:
<% d.card_collections.each do |x| %>
<%= x.sum_of_cards %>
<% end %>
<% if d.public %> Public <% end %><br />
<% end %>
</div>
答案 2 :(得分:0)
我能够弄清楚如何使用 Sum 功能来利用这些信息。
<div class="collectionList">
<% @user.collections.each do |d| %>
<div class="collectionSample">
<strong><%= link_to d.name, {:controller => "collections", :action => "show", :id => d.id } %></strong><br />
Distinct Cards: <%= d.card_collections.count %> <br />
Total Cards: <%= d.card_collections.sum(:card_counts) %>
<% if d.public %> Public <% end %><br />
</div>
<% end %>
</div>