Create a combined list of objects in the same table using ActiveRecord












0















My application has groups and relationships between users.
Relationships are mutual, so in every group G, user A will have a label for user B and vice versa.



Here's the code for the Relationship model:



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


On the Show User view (a.k.a. the "user profile" page), I'd like to create a table listing all the relationships, that would look like so.



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


So, with some help from @Rohit Patel's answer, I've progressed to the following syntax.



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")


It gets me the rows I need, but not the extra fields from the objects in b and groups.



The SQL to represent this would be:



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"


I can't figure out how to do this with ActiveRecord.



What should I do?










share|improve this question





























    0















    My application has groups and relationships between users.
    Relationships are mutual, so in every group G, user A will have a label for user B and vice versa.



    Here's the code for the Relationship model:



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


    On the Show User view (a.k.a. the "user profile" page), I'd like to create a table listing all the relationships, that would look like so.



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


    So, with some help from @Rohit Patel's answer, I've progressed to the following syntax.



    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")


    It gets me the rows I need, but not the extra fields from the objects in b and groups.



    The SQL to represent this would be:



    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"


    I can't figure out how to do this with ActiveRecord.



    What should I do?










    share|improve this question



























      0












      0








      0








      My application has groups and relationships between users.
      Relationships are mutual, so in every group G, user A will have a label for user B and vice versa.



      Here's the code for the Relationship model:



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


      On the Show User view (a.k.a. the "user profile" page), I'd like to create a table listing all the relationships, that would look like so.



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


      So, with some help from @Rohit Patel's answer, I've progressed to the following syntax.



      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")


      It gets me the rows I need, but not the extra fields from the objects in b and groups.



      The SQL to represent this would be:



      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"


      I can't figure out how to do this with ActiveRecord.



      What should I do?










      share|improve this question
















      My application has groups and relationships between users.
      Relationships are mutual, so in every group G, user A will have a label for user B and vice versa.



      Here's the code for the Relationship model:



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


      On the Show User view (a.k.a. the "user profile" page), I'd like to create a table listing all the relationships, that would look like so.



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


      So, with some help from @Rohit Patel's answer, I've progressed to the following syntax.



      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")


      It gets me the rows I need, but not the extra fields from the objects in b and groups.



      The SQL to represent this would be:



      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"


      I can't figure out how to do this with ActiveRecord.



      What should I do?







      ruby-on-rails activerecord






      share|improve this question















      share|improve this question













      share|improve this question




      share|improve this question








      edited Nov 19 '18 at 13:37







      Jono

















      asked Nov 19 '18 at 6:19









      JonoJono

      178213




      178213
























          1 Answer
          1






          active

          oldest

          votes


















          1














          Following should do:



          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']
          )


          Let me know if it helps!






          share|improve this answer























            Your Answer






            StackExchange.ifUsing("editor", function () {
            StackExchange.using("externalEditor", function () {
            StackExchange.using("snippets", function () {
            StackExchange.snippets.init();
            });
            });
            }, "code-snippets");

            StackExchange.ready(function() {
            var channelOptions = {
            tags: "".split(" "),
            id: "1"
            };
            initTagRenderer("".split(" "), "".split(" "), channelOptions);

            StackExchange.using("externalEditor", function() {
            // Have to fire editor after snippets, if snippets enabled
            if (StackExchange.settings.snippets.snippetsEnabled) {
            StackExchange.using("snippets", function() {
            createEditor();
            });
            }
            else {
            createEditor();
            }
            });

            function createEditor() {
            StackExchange.prepareEditor({
            heartbeatType: 'answer',
            autoActivateHeartbeat: false,
            convertImagesToLinks: true,
            noModals: true,
            showLowRepImageUploadWarning: true,
            reputationToPostImages: 10,
            bindNavPrevention: true,
            postfix: "",
            imageUploader: {
            brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
            contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
            allowUrls: true
            },
            onDemand: true,
            discardSelector: ".discard-answer"
            ,immediatelyShowMarkdownHelp:true
            });


            }
            });














            draft saved

            draft discarded


















            StackExchange.ready(
            function () {
            StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53369264%2fcreate-a-combined-list-of-objects-in-the-same-table-using-activerecord%23new-answer', 'question_page');
            }
            );

            Post as a guest















            Required, but never shown

























            1 Answer
            1






            active

            oldest

            votes








            1 Answer
            1






            active

            oldest

            votes









            active

            oldest

            votes






            active

            oldest

            votes









            1














            Following should do:



            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']
            )


            Let me know if it helps!






            share|improve this answer




























              1














              Following should do:



              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']
              )


              Let me know if it helps!






              share|improve this answer


























                1












                1








                1







                Following should do:



                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']
                )


                Let me know if it helps!






                share|improve this answer













                Following should do:



                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']
                )


                Let me know if it helps!







                share|improve this answer












                share|improve this answer



                share|improve this answer










                answered Nov 19 '18 at 7:22









                eurodo061eurodo061

                7114




                7114






























                    draft saved

                    draft discarded




















































                    Thanks for contributing an answer to Stack Overflow!


                    • Please be sure to answer the question. Provide details and share your research!

                    But avoid



                    • Asking for help, clarification, or responding to other answers.

                    • Making statements based on opinion; back them up with references or personal experience.


                    To learn more, see our tips on writing great answers.




                    draft saved


                    draft discarded














                    StackExchange.ready(
                    function () {
                    StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53369264%2fcreate-a-combined-list-of-objects-in-the-same-table-using-activerecord%23new-answer', 'question_page');
                    }
                    );

                    Post as a guest















                    Required, but never shown





















































                    Required, but never shown














                    Required, but never shown












                    Required, but never shown







                    Required, but never shown

































                    Required, but never shown














                    Required, but never shown












                    Required, but never shown







                    Required, but never shown







                    Popular posts from this blog

                    Biblatex bibliography style without URLs when DOI exists (in Overleaf with Zotero bibliography)

                    ComboBox Display Member on multiple fields

                    Is it possible to collect Nectar points via Trainline?