Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails Rails活动记录查询-多值条件(AND而不是OR)_Ruby On Rails_Activerecord - Fatal编程技术网

Ruby on rails Rails活动记录查询-多值条件(AND而不是OR)

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

我正在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 < 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),这只是从他们的文档中复制的一个示例。它必须根据您的设置进行调整谢谢,谢谢您这么说。