ruby-on-rails – Rails,如何避免在关联中的总计(count,size,counter_cache)的“N 1”查询?

我有这些机型:
class Children < ActiveRecord::Base
    has_many :tickets
    has_many :movies,through: :tickets
end


class Movie < ActiveRecord::Base
    has_many :tickets
    has_many :childrens,through: :tickets
    belongs_to :cinema
end


class Ticket < ActiveRecord::Base
    belongs_to :movie,counter_cache: true
    belongs_to :children
end


class Cinema < ActiveRecord::Base
    has_many :movies,dependent: :destroy
    has_many :childrens,through: :movies
end

我现在需要的是“电影院”的页面,我想打印这个电影院的孩子的总和(数量,大小?),所以我写道:

>在cinemas_controller.rb中:

@childrens = @ cinema.childrens.uniq

>在电影院/ show.html.erb:

<%@ childrens.each do | children | %><%= children.movi​​es.size%><%end%>

但显然我有弹珠宝,提醒我的Counter_cache,我不知道在哪里放这个counter_cache,因为电影的不同的id.

而且没有counter_cache,我不是我想要的,因为我想要一个数字,这个电影院里有多少孩子从这个电影院的许多日子里把他们从门票里拿走.

如何?

UPDATE

如果在我看来我使用这个代码

<% @childrens.each do |children| %>
  <%= children.movies.where(cinema_id: @cinema.id).size %>
<% end %>

宝石子弹不要说我什么,一切都正常工作.

但我有一个问题:这种查询数据库的方式比较重,因为视图中的代码

解决方法

这可能会帮助你.
@childrens_count = @cinema.childrens.joins(:movies).group("movies.children_id").count.to_a

相关文章

以下代码导致我的问题: class Foo def initialize(n=0) @n = n end attr_accessor :n d...
这是我的spec文件,当为上下文添加测试“而不是可单独更新用户余额”时,我得到以下错误. require 's...
我有一个拦截器:DevelopmentMailInterceptor和一个启动拦截器的inititializer setup_mail.rb. 但我想将...
例如,如果我有YAML文件 en: questions: new: 'New Question' other: recent: ...
我听说在RSpec中避免它,let,let !,指定,之前和主题是最佳做法. 关于让,让!之前,如果不使用这些,我该如...
我在Rails中使用MongoDB和mongo_mapper gem,项目足够大.有什么办法可以将数据从Mongoid迁移到 Postgres...