【问题标题】:Ruby on Rails Multiple relationship roles using one modelRuby on Rails 使用一个模型的多个关系角色
【发布时间】:2015-01-29 05:23:16
【问题描述】:

组:

  • 创作者

  • 管理员

  • 成员

  • 播放列表

每个创建者/管理员/成员都是用户。 我需要能够从每个用户那里调用这些:

  • User.mygroups(我是创建者的组)

  • User.controlledgroups(我是管理员的组)

  • User.joinedgroups(我所属的组)

我怎样才能做到这一点? 我知道我可以做这样的事情。从用户的角度来看会如何?

class Group < ActiveRecord::Base
    has_one :creator, :class :user
    has_many :admins, :class :user
    has_many :memebers, :class :user
end

【问题讨论】:

    标签: ruby-on-rails ruby relationship role


    【解决方案1】:

    在用户模型中

    class User < ActiveRecord::Base
      has_many :my_groups,
            :class_name => "Group",
            :foreign_key => :creator_id
      has_and_belongs_to_many :controlled_groups,
            :class_name => "Group",
            :join_table => :admins_groups
      has_and_belongs_to_many :joined_groups,
            :class_name => "Group",
            :join_table => :groups_members
    end
    

    在组模型中

    class Group < ActiveRecord::Base
        belongs_to :creator, :class_name => "User"
        has_and_belongs_to_many :admins,
               :class_name => "User",
               :join_table => :admins_groups
        has_and_belongs_to_many :members,
               :class_name => "User",
               :join_table => :groups_members
    end
    

    迁移

    # migration to create join table for admins and groups
    def change
       create_table :admins_groups, :id => false do |t|
          t.integer :user_id
          t.integer :group_id
       end
    end
    
    # migration to create join table for members and groups
    def change
       create_table :groups_members, :id => false do |t|
          t.integer :user_id
          t.integer :group_id
       end
    end
    # in migration where you create groups table
    def change
       create_table :groups do |t|
          # ....  all other fields
          t.integer :creator_id # id for group creator
          t.timestamps
       end
    end
    

    【讨论】:

    • 看起来不错。我虽然不知道这种事情的迁移会是什么样子。你能帮我解决这个问题吗?
    • 您能帮我迁移一下吗?
    • 我编辑了帖子,更改了关联并为新关联添加了迁移。你仍然可以获得你想要的功能
    【解决方案2】:

    对于每个 has_many,您都需要在 User 类中有一个 belongs_to。 然后你可以有 scopes 或类方法来满足你的 User._ 要求。

    喜欢:

    class User < ..
      scope :mygroups, ->{ where(:id => "Group.creator_id") }
      scope :controlledgroups, ->{ where(:id => "Group.admin_id") }
    end
    

    还有其他方法可以根据您的喜好编写查询,如果您在 User 中有一个布尔字段说 admin: true,那么它会有所不同。 但是您确实需要指定外键,例如

    has_many :admins, class_name: "User", foreign_key: "admin_id"
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-05-31
      • 2015-12-24
      • 1970-01-01
      • 1970-01-01
      • 2021-08-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多