将功能从视图移动到控制器Rails 5

时间:2016-11-29 02:20:34

标签: ruby-on-rails

试图弄清楚如何将大量逻辑从视图移动到控制器/模型中。

(我认为它应该进入模型?)

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

3 个答案:

答案 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>