按提供的标签过滤表格 - 有效记录

时间:2016-11-30 06:33:40

标签: mysql ruby-on-rails activerecord

我有以下表格

  1. 用户
  2. 文章
  3. 标签(1对多)
  4. 标签可以同时适用于用户和文章。 (用户标签是要列入黑名单的标签 - 即不显示用用户提交的标签标记的文章)。因此,他们有以下列

    1. ID
    2. taggable_type('article'或'user')
    3. title(string)
    4. taggable id(相关文章ID或用户ID)
    5. 当用户执行get请求时,我想让activerecord过滤掉所有提供用户黑名单标签的文章。

      我执行以下操作以获取用户列入黑名单的数组

      if user != nil
        user_tags = user.tags
        blacklisted_tags = []
        user_tags.each do |user|
          blacklisted_tags.push(user.title)
        end
        puts "\n \n \n user tags - #{blacklisted_tags} \n \n \n"
      end
      
      blacklisted_tags = ['foo','bar']
      

      我似乎无法使用activerecord来正确过滤掉任何标有任何blacklisted_tags的文章。

      这是我到目前为止所做的事情

      negations[:tags] = "tags.title not in #{blacklisted_tags}"
      
      @articles = Article.order(followed).left_outer_joins(:tags).where.not(negations)
      

      我得到以下sql错误 -

      (Mysql2::Error: Unknown column 'articles.taggable_id' in 'where clause': SELECT  `articles`.* FROM `articles` LEFT OUTER JOIN `tags` ON `tags`.`taggable_id` = `articles`.`id` AND `tags`.`taggable_type` = 'article' WHERE (`articles`.`taggable_id` != 'tags.title not in [\"foo\", \"bar\"]')
      

      rails从哪里获取'articles.taggable_id'?

      有没有更好的方法来解决这个问题?

1 个答案:

答案 0 :(得分:1)

试一试:

@articles = Article.joins(:tags).where.not(tags: { title: blacklisted_tags})