所以,我有两个模型:User
和Group
。
User belongs_to :group
和
Group has_many :users
。
创建新User
时,我想检查已创建的Group
并分配它们,或根据用户提供的信息创建新的Group
。 Group.find_or_create_by_name("Name")
似乎是一种很好的方法,但我的问题是它应该位于何处?我猜测跟随“胖模型,瘦的控制器”它应该在user.rb
。如果它在模型中,在用户创建时传递用户提供的字符串的最佳方法是什么?我应该在user.rb
中设置方法,然后在users_controller.rb
中调用该方法吗?
我猜一个相关的问题:我知道我的架构应该反映
create_table "users" do |t|
t.integer "group_id"
用于查询。 Rails如何“自动”链接这些?在创建我的Group
模型时,我猜它需要有一个string:id
列,而Rails只是链接这两个?
很抱歉我明显缺乏对协会的理解,但我不想只是一起破解一些笨拙的东西,并且想要确保我理解最好的方法。
答案 0 :(得分:1)
首先,根据您所写的内容,一个群组中可以包含多个用户,但用户只能属于一个群组。
通常,一个组可以有多个成员,用户可以是多个组的成员。为此,您需要创建一个名为membership
的关联模型。
因此,您的用户模型包含:
has_many :memberships
has_many :groups, :through => :memberships
你的小组模特有:
has_many :memberships
has_many :members, :through => memberships
该协会将有一个表格,如下所示:
create_table "memberships" do |t|
t.integer "group_id"
t.integer "user_id"
t.timestamps
end
add_index :memberships, :group_id
add_index :memberships, :user_id
要回答原始问题,如果您在创建用户时必须创建一个组而不管他是如何创建的,我会在用户模型中创建一个Active Record Callback:
after_create :create_group
def create_group
# whatever logic and create group
end
有关Active Record Callbacks的更多信息,请参阅http://api.rubyonrails.org/classes/ActiveRecord/Callbacks.html
如果您创建的组与在表单(视图)中输入的信息相关并且与用户没有直接关系,那么您必须在控制器中创建组。类似的东西:
def create
@group = Group.build(params[:group])
@group.save!
@user = User.build(params[:user])
@user.group_id = @group.id
@user.save!
end
或者,更清洁的方式:
def create
@group = Group.build(params[:group])
@group.save!
@user = @group.users.build(params[:user])
@user.save!
end