【发布时间】:2015-10-17 17:03:39
【问题描述】:
我正在开发一个 Rails 应用程序。我有一个option_id 的数组,它可以有不同的长度。通过答案,选项和用户之间存在多对多的关系。给定以下模型:
class Option < ActiveRecord::Base
has_many :answers
has_many :users, through: :answers
end
class User < ActiveRecord::Base
has_many :answers
has_many :options, through: :answers
end
class Answer < ActiveRecord::Base
belongs_to :user
belongs_to :option
end
我必须找到所有回答了数组中所有选项的用户。
例如,如果数组是[1,2],我想要Option.find(1).users 和Option.find(2).users 返回的用户的交集。在这种情况下,我认为这可以通过Option.find(1).users.merge(Option.find(2).users) 之类的操作来实现。
但是,该数组可以包含任意数量的元素,因此上述解决方案不可行。
我唯一的想法是做一个如下所示的循环,但对于更长的数组来说,这似乎真的很重的数据库调用:
array = [1,2,3,4,5]
array.each do |option_id, index|
if index == 0
users = Option.find(option_id).users
end
users = users.merge(Option.find(option_id).users)
end
我想知道是否有一种更优雅、更简单的方法可以在单个查询中获取信息和/或不使用循环。如果 SQL 变得更好,我会很乐意使用它。
谢谢!
【问题讨论】:
标签: ruby-on-rails arrays activerecord