组:
创建者
管理员
成员
播放列表
每个创建者/管理员/成员都是用户。 我需要能够从每个用户调用这些:
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
答案 0 :(得分:2)
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
答案 1 :(得分:1)
对于每个has_many,您需要在User类中使用belongs_to。
然后,您可以为User._要求提供scopes
或类方法。
喜欢:
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"