创建一个自定义ActiveRecord关联“ has_many_tagged”,以扩展“ has_many”

时间:2018-08-10 20:03:32

标签: ruby-on-rails rails-activerecord

我正在尝试设计这种查询机制,在该机制中,我具有与Tag模型相关联的模型(具有多态关联as: taggable),以便当我运行a:modelA.modelBs时,它将进行检查如果modelA实例和modelBs关联responds_to?(:tags)关联,则按标签的交集过滤查询。

示例

# modelA_instance1.tags == [1, 4, 9]
# modelA_instance2.tags == [2, 3]
# modelB_instance1.tags == [1, 2]
# modelB_instance2.tags == [4]
expect(modelA_instance1.modelBs).to contain_exactly([modelB_instance1, modelB_instance2])
expect(modelA_instance2.modelBs).to contain_exactly([modelB_instance1])

但是理想情况下,我希望它是无缝的,而不必使用加入has_many :modelBs模型的范围来定义:tags

有可能吗?我可以覆盖ActiveRecord的(或某些)吸气剂来做到这一点吗?

或者我可以创建在has_many上扩展的内容,例如has_many_tagged :modelBs

def has_many_tagged(... scope ...)
  # extend scope with join on tags and call original has_many
end

0 个答案:

没有答案