mysql - 按提供的标签过滤表 - 事件记录

标签 mysql ruby-on-rails activerecord

我有下表

  1. 用户
  2. 文章
  3. 标签(1 到多个)

标签可以应用于用户和文章。 (用户标签是要列入黑名单的标签 - 即不显示带有用户提交标签的文章)。因此,他们有以下几列

  1. ID
  2. taggable_type(“文章”或“用户”)
  3. 标题(字符串)
  4. 可标记 ID(相关文章 ID 或用户 ID)

当用户执行 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”?

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

最佳答案

尝试一下:

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

关于mysql - 按提供的标签过滤表 - 事件记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40881764/

相关文章:

ruby-on-rails - Ruby on Rails 中的静态页面

ruby-on-rails - 如何在 Rails 中将字形放入 simple_form 提交中?

ruby-on-rails - Rails Rspec 测试中的多重期望

ruby-on-rails - Rails 对现有的 ActiveRecord 结果数组进行分页

mysql - 使用codeigniter的事件记录语法增加mysql数据库的字段

php - 依赖嵌套 select 和删除 MySQL 语句中的多个表

c# - 使用 MongoDB 从不同客户端同时对同一对象进行多次更新

mysql - 大查询会影响性能

ruby-on-rails - ActiveRecord:更改现有列默认值的最简洁方法

mysql - 如何在 MySQL LEFT JOIN 中使用别名