根据所有关联成员过滤记录

时间:2017-08-23 20:47:31

标签: sql ruby-on-rails

我有一个名为Story的模型,它有 - 并且属于很多 - 标签。我正在尝试创建基于故事属性仅显示某些故事的功能。我通过链接where() s:

来做到这一点
q = Story.where(condition1)
q = q.where(condition2)

......等等。我希望能够过滤的其中一件事就是标签,起初我尝试按照以下方式进行:

q = q.joins(:tags)
q = q.where(tagCondition1)
q = q.where(tagCondition2)
...

但是,这只发现具有匹配所有条件的单个标记的故事。我想找到至少有一个符合每个条件的标签的所有故事。也就是说,目前如果我有条件LIKE %al%LIKE %be%,它将匹配带有标记'alpha beta'的故事;我希望它还匹配标记'alpha'和标记'beta'

的故事

4 个答案:

答案 0 :(得分:0)

也许您需要以下内容来匹配多个条件:

$.ajax({
    // ...
    dataType: 'json'
    // ...
});

答案 1 :(得分:0)

您可以将firebase serve --only functions与计数结合使用。

HAVING

用法:

class Story < ActiveRecord::Base
  has_and_belongs_to_many :tags

  def self.with_tags(*tags, min: 1)
    joins(:tags)
      .where(tags: { name: tags })
      .group('story.id')
      .having("count(*) = ?", min)
  end
end

包含任何标记params[:tag] = "foo bar baz" Story.with_tags(params[:tag], *params[:tag].split) 的故事。

答案 2 :(得分:0)

查询错误。由于您使用的是AND,并且您希望匹配第一个或第二个条件。也许你应该使用像

这样的东西

where("tags.field like '%al% or tags.field like '%be%'")

答案 3 :(得分:0)

好的,所以这就是我最终做的事情:(为谷歌搜索和类似问题的人添加):

conditions.each do |condition|
  q_part = select('1').from('stories_tags')
  q_part = q_part.where('stories_tags.story_id = stories.id')
  q_part = q_part.where('stories_tags.name SIMILAR TO ?', condition)
  q = q.where("EXISTS (#{q_part.to_sql})")
end