【问题标题】:Rails 4 eager loading with multiple tablesRails 4 急切加载多个表
【发布时间】:2014-05-09 01:38:00
【问题描述】:

我正在尝试使用 5 个表加载结果:

class Meeting < ActiveRecord::Base
  has_many :bookings
end

class Booking < ActiveRecord::Base
  belongs_to :user
  belongs_to :meeting
  belongs_to :role
  belongs_to :group
end

class Group < ActiveRecord::Base
  has_many :group_memberships
  has_many :users, through: :group_memberships
end

class GroupMembership < ActiveRecord::Base
  belongs_to :group
  belongs_to :user
end

class User < ActiveRecord::Base
  has_many :group_memberships
  has_many :groups, through: :group_memberships
end

在 MeetingController.rb 中:

def index
    @meetings = Meeting.where(year: @year)
end

我正在尝试使用 includes(:bookings) 但根据bullet-gem 急加载不起作用。在我看来,我称之为这条线:

@meetings.each do |meeting|
  meeting.bookings.find_by(group: @group, role: @role)
end

我收到了多段 52 行代码,这显然意味着我并不急于加载任何数据:

Booking Load (0.1ms)  SELECT "bookings".* FROM "bookings" WHERE "bookings"."meeting_id" = ? AND "bookings"."user_id" = 8 AND "bookings"."group_id" = 2 LIMIT 1  [["meeting_id", 207]]
  Rendered shared/_book.html.haml (1.0ms)
  Booking Load (0.1ms)  SELECT "bookings".* FROM "bookings" WHERE "bookings"."meeting_id" = ? AND "bookings"."group_id" = 2 AND "bookings"."role_id" = 4 LIMIT 1  [["meeting_id", 208]]
  Booking Load (0.0ms)  SELECT "bookings".* FROM "bookings" WHERE "bookings"."meeting_id" = ? AND "bookings"."user_id" = 8 AND "bookings"."group_id" = 2 LIMIT 1  [["meeting_id", 208]]
  Rendered shared/_book.html.haml (1.0ms)
  Booking Load (0.1ms)  SELECT "bookings".* FROM "bookings" WHERE "bookings"."meeting_id" = ? AND "bookings"."group_id" = 2 AND "bookings"."role_id" = 4 LIMIT 1  [["meeting_id", 209]]

bullet.log:

2014-03-29 15:30:48[WARN] user: karlingen
localhost:3000http://localhost:3000/meetings/host
Unused Eager Loading detected
  Meeting => [:bookings]
  Remove from your finder: :include => [:bookings]

任何想法我应该做什么?

【问题讨论】:

  • 你能把子弹的日志也包括进去吗?
  • @vee 我已经添加了。
  • 我猜你不能在集合上使用 find_by 并期望它不会发出 SQL 查询。你需要使用某种红宝石的select
  • karlingen,试试这个 -> Meeting.includes(:bookings).where(year: @year).references(:bookings)

标签: ruby-on-rails ruby ruby-on-rails-4 associations eager


【解决方案1】:

尝试以下方法:

@meetings = Meeting.includes(:bookings).where(year: @year)

另外,你在@year 中过得怎么样?

【讨论】:

    【解决方案2】:
    Meeting.includes(:bookings).where(year: @year).references(:bookings)
    

    如果您使用的是 rails 4,则可以使用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多