Ruby on rails Rails活动记录查询-多值条件(AND而不是OR)
我正在Rails 4.1应用程序中使用。我正在使用一个范围根据一个标记或多个标记进行搜索。当多个标记作为参数给定时,我希望搜索只返回包含所有标记的标记项。当前,范围I返回的标记项至少包含一个标记(标记a或标记b或标记c)。我想要一个范围,而不是一个AND条件(tag_a和tag_b以及tag_c) 示例Ruby on rails Rails活动记录查询-多值条件(AND而不是OR),ruby-on-rails,activerecord,Ruby On Rails,Activerecord,我正在Rails 4.1应用程序中使用。我正在使用一个范围根据一个标记或多个标记进行搜索。当多个标记作为参数给定时,我希望搜索只返回包含所有标记的标记项。当前,范围I返回的标记项至少包含一个标记(标记a或标记b或标记c)。我想要一个范围,而不是一个AND条件(tag_a和tag_b以及tag_c) 示例 document_a_tags = ['programming', 'ruby'] document_b_tags = ['programming', 'python'] class User
document_a_tags = ['programming', 'ruby']
document_b_tags = ['programming', 'python']
class User < ActiveRecord::Base
has_many :documents, dependent: :destroy
scope :with_fields, proc { |fields|
if fields.reject!(&:empty?).present?
joins(documents: [{ taggings: :tag }]).where(tags: { slug: fields })
end
}
end
class Document < ActiveRecord::Base
acts_as_taggable
belongs_to :user
end
document_a_标签=['programming','ruby']
document_b_标记=['programming','python']
类用户
当前,如果搜索参数包括
编程
和ruby
则会返回文档a和文档b。我想要的是一个范围,如果搜索参数包括编程
和ruby
只返回文档。考虑到mysql的工作方式,我认为这很难在单个活动记录查询中实现
联接为连接到条目的每个标记添加一行,并且条件一次仅应用于一行。也就是说,一行不能被表示结果中某些其他行的条件排除
我认为可以编写一些复杂的递归查询,向结果中添加数量不确定的列,并对它们应用条件。但我认为,简单地使用当前的作用域,然后在ruby代码中丢弃没有所有标记的条目,将会更容易、更高效
编辑:
这可以在您使用的gem中完成。看看:
User.tagged_with(["awesome", "cool"], :match_all => true)
您是否尝试过:
用
标记您?e、 g.:Item.joins(文档:[{taggings::tag}])。用(字段)
标记了_?@User089247感谢您的建议。这给了我一个错误,因为标记在文档模型上,而不是用户模型上:NoMethodError(未定义的方法
标记为'for#@diask2':我不是以用户的身份编写的…
它是项.
但是,必须理解示例代码和实际代码之间的差异,并使用该思想使解决方案工作。谢谢。不过,这个范围在用户模型上,但它是文档模型(用户有很多:文档)这是有标记的。因此,如果我尝试使用tagged_,我会得到NoMethodError(未定义的方法“tagged_with”for),这只是从他们的文档中复制的一个示例。它必须根据您的设置进行调整谢谢,谢谢您这么说。