仅当子项具有特定属性时才查询对象

时间:2014-03-12 09:55:34

标签: ruby-on-rails ruby activerecord

我有几个模型定义如下:

class Question < ActiveRecord::Base
  has_many :skill_tags, as: :skillable
end

class SkillTag < ActiveRecord::Base
  belongs_to :skillable, polymorphic: true
  belongs_to :skill
end

class Skill < ActiveRecord::Base
  has_and_belongs_to_many :skill_tags
end

我想获得一个具有与之相关的特定技能的所有Question对象的数组。

例如 - 我想要所有具有技能标签的问题,其技能为16,34和89.这些问题可能在一个数组中。实现这一目标的Rails最友好的方式是什么?我可以想到一些更强大的蛮力&#39;接近,但我希望它尽可能干净。

2 个答案:

答案 0 :(得分:8)

这样的事情可以解决问题:

Question.joins(:skill_tag).where(:skill_tags => {:skill_id => [16, 34, 89]})

答案 1 :(得分:4)

除了SlicedPan基于SQL的优秀方法之外,您还应该考虑使用像scope这样的方法:

class Question < ActiveRecord::Base
  has_many :skill_tags, as: :skillable
  scope :tags(ids)-> { joins(:skill_tags).where("skill_tags.skill_id = ?", ids) }
end

这将允许您致电:

tags = [16, 17, 18]
@questions = Question.tags(tags)
相关问题