Ruby on rails 3 简单有很多:通过联想
非常简单的设置。我想确保我对ORM的理解是正确的Ruby on rails 3 简单有很多:通过联想,ruby-on-rails-3,activerecord,Ruby On Rails 3,Activerecord,非常简单的设置。我想确保我对ORM的理解是正确的 class User < ActiveRecord::Base has_many :memberships has_many :groups, through => memberships end class Group < ActiveRecord::Base has_many :memberships has_many :users, through => memberships end class
class User < ActiveRecord::Base
has_many :memberships
has_many :groups, through => memberships
end
class Group < ActiveRecord::Base
has_many :memberships
has_many :users, through => memberships
end
class Membership < ActiveRecord::Base
belongs_to :user
belongs_to :group
end
class用户成员身份
结束
类组会员身份
结束
类成员身份
现在,当用户创建组时,我希望填充链接表中的成员记录。它应该是一个原子(事务)
类组控制器“新建”
结束
结束
结束
这不管用。组已保存,但在链接表中未创建成员记录。但是,使用create vs build是可行的。这就是它的工作原理吗
这里最好的方法是什么?这种行为是故意的。正如您提到的,您可以执行
@group=current_user.groups.create(params[:group])
或者,您可以添加一条附加语句以在联接模型的表中创建记录,如下所示:
@group = current_user.groups.build(params[:group])
if @group.save
@group.memberships.create(:user_id => current_user)
# redirect and notify
好的,原因是简单地构建@group
并保存它不会在联接表中添加额外的记录
实际上,在这种情况下,@group=current_user.groups.build(params[:group])
与@group=group.new(params[:group])
有些相似。区别在于,在前一种情况下,current\u user.groups
将包含@groups
(您可以在重定向之前在groups中尝试创建),但执行current\u user.reload
,然后是current\u user.groups
将产生[]
做到这一点的最佳方法与您的方法有些类似。有一个简单的创建操作,如下所示:
def create
@group = Group.new(params[:group])
# if else for save and redirect
但是,为了实现这一点,提交给组#create
的参数散列应包括以下用户ID:
"group"=>{"name"=>"new group", "user_ids"=>["1", "2", "3"]}, "commit"=>"Create Group"
这可能就是@bruno077要求您粘贴视图代码的原因,以便了解传递的用户ID参数
因此,如果新的组表单包含用于选择多个用户的字段,则其简单的创建操作如上图所示(因为user_id参数)。但是如果您有一个新的组表单,没有选择用户的选项,那么您最好使用第一个选项(使用create) 您在@group.save行中有一个输入错误,(if开头不应该有一个@)。是的,粘贴它只是一个错误。问题仍然存在。是否可以粘贴视图的代码?仅传入的参数是组[name]&组[description]。问题的关键在于,就关联而言,构建与创建之间是否存在固有的不对称性。if@group.save的问题#创建会员;这不是原子性的,如果成员资格失败,您将留下一个孤立的组。此外,即使有一个包含多个用户的表单,create with group.new也不会有任何帮助,因为根本不使用关联。它永远不会像上面那样是一个简单的创建操作。是的,创建组然后创建成员的问题是原子性,因为它们是两个完全不同的事务。但是,我认为使用create,即当前用户.groups.create(params[:group])
作为单个事务时,不会出现这样的问题。如果联接模型验证导致在联接表中创建记录失败,则事务将回滚。因此,不应存在与成员身份无关的组。“此外,即使存在一个包含多个用户的表单,create with group.new也不会有任何帮助,因为根本不使用关联”。我不明白。你说协会从未被使用是什么意思?很抱歉,但我想情况并非如此。使用包含用户ID的参数,以及@group=group.new(params[:group])
和@group.save
,无需创建每个成员关联。使用如上所述定义的关联,Rails将在联接表中执行所需的插入。如果任何验证阻止创建@group
或memberships表中的任何记录,则事务将回滚,并且不应有未关联的记录。我认为原子性没有问题。我想你不是说在多个表中插入不利于原子性,是吗?
"group"=>{"name"=>"new group", "user_ids"=>["1", "2", "3"]}, "commit"=>"Create Group"