【问题标题】:Rails: How to query based on an extra field in a many-to-many relationship?Rails:如何根据多对多关系中的额外字段进行查询?
【发布时间】:2013-01-10 06:59:26
【问题描述】:

我对如何根据连接表中存在的额外字段查询多对多关系很感兴趣。最好通过示例询问。

我有一个模型 User 和一个模型 Group

多对多关系称为分组。它有一个额外的字段 'active_user'。我想查询一个组中所有活跃的用户。

如果我这样做:

@user.groupizations.find_all_by_active_user(true) - 给我一个分组列表;但是,我会寻找用户列表。也许我需要做一些映射?

谢谢!

【问题讨论】:

    标签: ruby-on-rails many-to-many associations


    【解决方案1】:

    您可以通过将关联加入到查询中来做到这一点,然后在关联表的范围内进行搜索:

    User.joins(:groupizations).where(:groupizations => {:active_user => true})
    

    请注意,如果多个分组满足此条件,这将返回重复的行。要获得不同的用户,您可以执行以下操作之一:

    • 添加对 .select("DISTINCT users.*") 的调用,其中一些 ORDER 子句为 .order("users.id")(根据需要更改排序列)
    • 像这样添加一个 GROUP BY 子句:.group("users.id")。对于非 MySQL 数据库,您可能需要更具体,并在分组中包含所有列:

      .group(User.column_names.map{|c| "users.#{c}"}.join(','))

    【讨论】:

      【解决方案2】:

      如果连接表上有一个额外的字段,您应该使用 has_many :through 而不是 has_many_to_many。使用相同的 API 可以做更多事情

      class User
        has_many :groupizations
        has_many :groups, through: groupization
      
        scope :active, joins(:groupizations).where("groupizations.active_user='1'")
      end
      
      # controller
      @active_users = User.active
      

      【讨论】:

      • 有趣。我不认为这是完全正确的 - 给我 [] ...不确定错误在哪里。假设它有效,我如何寻找特定组的活跃用户?
      • 我得到以下 sql 查询:SELECT "users".* FROM "users" INNER JOIN "groupizations" ON "groupizations"."user_id" = "users"."id" WHER E (groupizations .active_user='1')
      • 我假设您在 mysql 上,其中布尔值是整数,但实际上应该是: where(:groupizations => {:active_user => true}) 将根据您的数据库生成正确的查询(postgres...)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-18
      • 1970-01-01
      相关资源
      最近更新 更多