【发布时间】:2016-06-28 03:45:51
【问题描述】:
我有一个用于管理志愿者的 Rails 应用程序,并且我正在寻找编写复杂 SQL 查询以过滤所有志愿者记录的“Rails 方式”。我有以下型号:
class Volunteer < ActiveRecord::Base
has_many :volunteer_skills
has_many :skills, through: :volunteer_skills
has_many :volunteer_lists
has_many :lists, through: :volunteer_lists
end
class VolunteerSkill < ActiveRecord::Base
belongs_to :volunteer
belongs_to :skill
end
class VolunteerList < ActiveRecord::Base
belongs_to :volunteer
belongs_to :list
end
如果@lists 是List ID 数组,而@skills 是Skill ID 数组
- 我想在任何
@lists上找到所有志愿者,而不是@skills。 - 我想在任何
@lists上找到所有志愿者,而不是@skills。 - 我想在任何
@lists和@skills中找到所有志愿者。 - 我想在任何
@lists和所有@skills上找到所有志愿者。
在看到这个StackOverflow question 之后,我使用.find_by_sql 创建了这个问题的解决方案。当查询涉及查找所有@skills 的志愿者时,我构造了一个INTERSECT 查询。当查询涉及使用 ANY @skills 查找志愿者时,我构造了一个 UNION 查询。当查询涉及查找没有@skills 的志愿者时,我使用EXCEPT 格式化查询。
不幸的是,这种解决方案不如使用 ActiveRecord 的解决方案友好。我对编程很陌生,但我试图解决的问题似乎相当简单/常见。有没有更好的利用 ActiveRecord 的解决方案?
我非常感谢任何想法!
【问题讨论】:
标签: ruby-on-rails ruby rails-activerecord