Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ionic-framework/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 3 简单有很多:通过联想_Ruby On Rails 3_Activerecord - Fatal编程技术网

Ruby on rails 3 简单有很多:通过联想

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

非常简单的设置。我想确保我对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 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"