我到处寻找并且无法找到我正在寻找的确切内容。我知道我需要什么,但我无法将2和2放在一起。
这段代码不合适,但这就是这个想法:
class Group < ActiveRecord::Base
has_one :owner, :class_name => "user"
has_many :members, :class_name => "user"
end
class User < ActiveRecord::Base
belongs_to :groups
has_one :group, :class_name "user"
end
我相信我需要一个has_many:通过关联,但我不确定如何实现它。如何构建模型/控制器/迁移以表示上述参数中的关联?
答案 0 :(得分:1)
Modern Rails应用程序使用has_many through:
而不是HABTM。
class User < ActiveRecord::Base
has_many :groups, through: :user_groups
end
class Group < ActiveRecord::Base
has_one :owner, through: :user_groups, source: :user
has_many :members, through: :user_groups, source: :user
end
class UserGroups < ActiveRecord::Base
validates :owner, uniqueness: true
belongs_to :member, class_name: 'User'
belongs_to :group
belongs_to :owner, class_name: 'User'
end
在source
和has_many
上添加has_one
,您可以撰写Group.find(id).members
和Group.find(id).owner
。验证联接中组所有者的唯一性。
答案 1 :(得分:1)
我建议使用如下的连接表:
class Membership < ActiveRecord::Base
belongs_to :group
belongs_to :user
end
class Group < ActiveRecord::Base
belongs_to :owner, class_name: "User"
has_many :members, through: :memberships, source: :user
has_many :memberships
end
class User < ActiveRecord::Base
has_one :owned_group, foreign_key: "owner_id", class_name: "Group"
has_many :groups, through: :memberships
has_many :memberships
end
迁移如下:
class CreateMemberships < ActiveRecord::Migration
def change
create_table :memberships do |t|
t.references :user
t.references :group
t.timestamps null: false
end
end
end
class CreateUsers < ActiveRecord::Migration
def change
create_table :users do |t|
t.timestamps null: false
end
end
end
class CreateGroups < ActiveRecord::Migration
def change
create_table :groups do |t|
t.references :owner
t.timestamps null: false
end
end
end
答案 2 :(得分:0)
http://guides.rubyonrails.org/association_basics.html#the-types-of-associations
在这种情况下您可以使用的主要类型取决于您的要求
has_many :groups, through: join_table
其中连接表通过具有user_id和group_id来引用用户和组。这使您可以获得与组成员身份相关的其他信息,也许您想要加入日期或会员ID或类似内容。
has_and_belongs_to_many :groups
以类似的方式实现,但是通过评估连接模型,只需要给出关系两侧的组/用户列表
多态关系不会真正发挥作用,除非您计划拥有不同类型的成员资格,可能是团体或组织或需要类似但独立的数据库表的东西。