ruby on rails -仅当子对象具有特定属性时查询对象



我有几个模型定义如下:

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对象的数组,其中包含与它们相关联的特定技能。

例如,我希望所有的问题都有一个技能标签,skill_id为16、34和89。这些可以在一个数组中。实现这一目标的最适合rails的方法是什么?我可以想到一些更"蛮力"的方法,但我希望它尽可能干净。

类似这样的代码应该可以达到这个效果:

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

除了SlicedPan出色的基于sql的方法之外,您还应该考虑使用类似作用域的东西:

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)

相关内容

  • 没有找到相关文章

最新更新