使用ActiveRecord在同一表中创建对象的组合列表

时间:2018-11-19 06:19:00

标签: ruby-on-rails activerecord

我的应用程序具有用户之间的组和关系。 关系是相互的,因此在每个组G中,用户A都会为用户B贴上标签,反之亦然。

以下是关系模型的代码:

class Relationship < ApplicationRecord
    belongs_to :group
    belongs_to :user
    belongs_to :receiver, class_name: "User", optional: true

在“显示用户”视图(也称为“用户个人资料”页面)上,我想创建一个列出所有关系的表。

| Group | User | Label for | Label from |
|-------|------|-----------|------------|
| Clowns| B    | "Bozo"    | "Ninny"    |
| Dogs  | C    | "Rex"     |            |
| Tools | B    | "Hammer"  |  "Wrench"  |

因此,在@Rohit Patel的答案的帮助下,我已经进行了以下语法编写。

Relationship.select(:id, :group_id, :user_id, :receiver_id, :label, :'b.label as label_received').joins("left join relationships as b on relationships.receiver_id = b.user_id and relationships.group_id = b.group_id").where("relationships.user_id = 1")

它为我提供了我需要的行,但没有从bgroups中的对象获得的额外字段。

代表这一点的SQL将是:

SELECT a.group_name, a.user_id, a.label, b.name 
FROM relationships AS a
LEFT JOIN
relationships AS b
ON a.user_id = b.receiver_id
WHERE a.user_id = "A"

我不知道如何使用ActiveRecord做到这一点。

我该怎么办?

1 个答案:

答案 0 :(得分:1)

以下应该做:

Relationship.all(:select => "relationships.group_name, relationships.user_id, relationships.label, b.name",
         :joins     => "JOIN relationships AS b 
                              ON relationships.user_id = b.receiver_id",
         :conditions => ["relationships.user_id = 'A']
)

让我知道是否有帮助!