如何使用ActiveRecord查询基于关联标签查找记录

杰里米·盖斯(Jeremie Ges)

我有一个具有这些当前值的数据库:

User
id | name
1  | Sara
2  | Alice
3  | Samantha

UserTag
id | user_id | label      | value
1  | 1       | hair_color | blonde
2  | 1       | polite     | no

3  | 2       | hair_color | brunette
4  | 2       | polite     | yes

5  | 3       | hair_color | brunette
6  | 3       | polite     | no

以及相关的模型:

class User < ApplicationRecord
  has_many :tags,
    class_name: 'UserTag',
    foreign_key: :user_id,
    dependent: :destroy,
    inverse_of: :user
end

class UserTag < ApplicationRecord
  belongs_to :user, inverse_of: :tags, touch: true
end

我想找到所有“不礼貌”的用户,基本上就是“ Samantha”。我尝试了以下操作,但未成功:

# Returns 0
User.joins(:tags)
.where(user_tags: { label: 'hair_color', value: 'brunette' })
.where(user_tags: { label: 'polite', value: 'no' })
.count
# .to_sql
"SELECT \"users\".* FROM \"users\" INNER JOIN \"user_tags\" ON \"user_tags\".\"user_id\" = \"users\".\"id\" WHERE \"user_tags\".\"label\" = 'hair_color' AND \"user_tags\".\"value\" = 'brunette' AND \"user_tags\".\"label\" = 'polite' AND \"user_tags\".\"value\" = 'no'"

我究竟做错了什么?

最高

如果您真的想构建标签系统而不仅仅是EAV怪兽,这就是您的方法。

首先创建标准化标签表和user_tags连接表:

class CreateTags < ActiveRecord::Migration[6.0]
  def change
    create_table :tags do |t|
      t.string :name, unique: true
      t.timestamps
    end
  end
end

class CreateUserTags < ActiveRecord::Migration[6.0]
  def change
    create_table :user_tags do |t|
      t.references :user, null: false, foreign_key: true
      t.references :tag, null: false, foreign_key: true
      t.timestamps
    end
    add_index [:user_id, :tag_id], unique: true
  end
end

然后设置关联:

class Tag < ApplicationRecord
  has_many :user_tags
  has_many :users, through: :user_tags
  validates_uniqueness_of :name
end

class UserTag < ApplicationRecord
  belongs_to :user
  belongs_to :tag
  validates_uniqueness_of :tag_id, scope: :user_id
end

class User < ApplicationRecord
  has_many :user_tags
  has_many :tags, through: :user_tags
end

要查询具有多个标签的用户,您可以执行以下操作:

User.joins(:tags)
    .where(tags: { name: ['Brunette', 'Impolite'] } )
    .group('users.id')
    .having('count(*) = 2')

您也可以将其放入类方法中:

class User < ApplicationRecord
  has_many :user_tags
  has_many :tags, through: :user_tags

  def self.with_tags(*tags)
    raise ArgumentError, 'must pass more than one tag' if tags.none?
    self.joins(:tags)
        .where(tags: { name: tags } )
        .group('users.id')
        .having('count(*) = ?', tags.length)
  end
end

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何在Rails中使用ActiveRecord查询关联的关联?

来自分类Dev

Rails:基于关联值的ActiveRecord查询

来自分类Dev

如何使用 SQL ILIKE 搜索查询 ActiveRecord 关联 (.joins)

来自分类Dev

基于关联属性的Rails查询记录

来自分类Dev

如何查找与给定条件没有关联的记录?(ActiveRecord / PostgreSQL)

来自分类Dev

如何使用Rails 4 + PostgreSQL查询关联记录的列表?

来自分类Dev

ActiveRecord:查找与某个值具有关联的记录

来自分类Dev

如何交织多个ActiveRecord关联查询?

来自分类Dev

Rails Activerecord:如何排除具有多个关联记录的记录

来自分类Dev

如何使用SQL查询基于顺序关系选择记录

来自分类Dev

ActiveRecord从没有关联的关联中查找记录

来自分类Dev

Mongodb查询如何通过记录创建或与记录关联

来自分类Dev

如何基于查询更新重复的mySQL记录

来自分类Dev

如何改善has_one关联的activerecord查询

来自分类Dev

如何在 ActiveRecord 中以关联表为条件进行查询

来自分类Dev

休眠查询以基于子字符串查找记录

来自分类Dev

运行查询以基于表查找唯一记录

来自分类Dev

使用ActiveRecord查询时Rails无法理解关联

来自分类Dev

如何基于“水线”关联中的字段搜索记录?

来自分类Dev

Algolia基于Rails关联的搜索标签,如何在创建/销毁关联时更新标签?

来自分类Dev

Rails,ActiveRecord,has_many:through:查找没有关联的所有记录

来自分类Dev

ActiveRecord:查找具有所有条件的关联记录

来自分类Dev

如何基于相关模型的存在来检索ActiveRecord记录

来自分类Dev

如何基于相关模型的存在来检索ActiveRecord记录

来自分类Dev

如何编写查询以查找未处理的记录

来自分类Dev

如何使用Protector限制基于关联的模型?

来自分类Dev

如何从2多对多关系中查找关联记录

来自分类Dev

在没有关联记录的情况下如何查找

来自分类Dev

Rails如何通过关联的ID包含数组查找记录

Related 相关文章

  1. 1

    如何在Rails中使用ActiveRecord查询关联的关联?

  2. 2

    Rails:基于关联值的ActiveRecord查询

  3. 3

    如何使用 SQL ILIKE 搜索查询 ActiveRecord 关联 (.joins)

  4. 4

    基于关联属性的Rails查询记录

  5. 5

    如何查找与给定条件没有关联的记录?(ActiveRecord / PostgreSQL)

  6. 6

    如何使用Rails 4 + PostgreSQL查询关联记录的列表?

  7. 7

    ActiveRecord:查找与某个值具有关联的记录

  8. 8

    如何交织多个ActiveRecord关联查询?

  9. 9

    Rails Activerecord:如何排除具有多个关联记录的记录

  10. 10

    如何使用SQL查询基于顺序关系选择记录

  11. 11

    ActiveRecord从没有关联的关联中查找记录

  12. 12

    Mongodb查询如何通过记录创建或与记录关联

  13. 13

    如何基于查询更新重复的mySQL记录

  14. 14

    如何改善has_one关联的activerecord查询

  15. 15

    如何在 ActiveRecord 中以关联表为条件进行查询

  16. 16

    休眠查询以基于子字符串查找记录

  17. 17

    运行查询以基于表查找唯一记录

  18. 18

    使用ActiveRecord查询时Rails无法理解关联

  19. 19

    如何基于“水线”关联中的字段搜索记录?

  20. 20

    Algolia基于Rails关联的搜索标签,如何在创建/销毁关联时更新标签?

  21. 21

    Rails,ActiveRecord,has_many:through:查找没有关联的所有记录

  22. 22

    ActiveRecord:查找具有所有条件的关联记录

  23. 23

    如何基于相关模型的存在来检索ActiveRecord记录

  24. 24

    如何基于相关模型的存在来检索ActiveRecord记录

  25. 25

    如何编写查询以查找未处理的记录

  26. 26

    如何使用Protector限制基于关联的模型?

  27. 27

    如何从2多对多关系中查找关联记录

  28. 28

    在没有关联记录的情况下如何查找

  29. 29

    Rails如何通过关联的ID包含数组查找记录

热门标签

归档