2

我需要为a有权查看party_visits的 a创建一个查询。我有以下型号:locationuser

class User < ActiveRecord::Base
  has_many :location_permissions
  has_many :party_visits
end

class LocationPermission < ActiveRecord::Base
  belongs_to :location
  belongs_to :user
end

class Party < ActiveRecord::Base
  has_many :party_visits
end

class PartyVisit < ActiveRecord::Base
  belongs_to :party
  belongs_to :user
  belongs_to :location
end

所以以下工作:

allowed_locations = current_user.location_permissions.map {|location_permission| location_permission.location_id}
party_visits = PartyVisit.where(location_id: allowed_locations)

问题有时allowed_locations很大那么PartyVisit查询是非常低效的。有没有办法把它变成 1 个高效的 Rails/ActiveRecord 查询?可能不涉及子选择查询?我很想在 Rails 中写这个而不求助于 SQL。

4

1 回答 1

0

您可以像这样进行此查询:

party_visits = PartyVisit.where(location_id:
  current_user.location_permissions.select(:location_id))

这将运行单个数据库查询,而不会将中间结果加载到内存中。

于 2014-09-02T21:00:26.067 回答