我有一个has_many:通过所有权连接模型通过用户和项目之间的关系。我希望能够在创建用户和新项目之间的关系时设置所有权模型的属性。以下是我到目前为止的情况:
def create
@project = Project.new(params[:project])
if @project.save
current_user.projects << @project
flash[:success] = "Project created!"
redirect_to @project
else
flash[:error] = "Project not created."
end
end
基本上,我不知道在为给定用户创建新项目时如何在所有权模型中设置值“owner_type”,因为我没有在项目创建控制器中直接提及所有权连接模型。我该怎么做?
这是我的所有权(加入)模式:
class Ownership < ActiveRecord::Base
attr_accessible :owner_type
belongs_to :project
belongs_to :user
validates :user_id, :presence => true
validates :project_id, :presence => true
validates :owner_type, :presence => true
end
和我的用户模型:
class User < ActiveRecord::Base
attr_accessible :name, :email, :admin, :projects
has_many :ownerships
has_many :projects, :through => :ownerships
accepts_nested_attributes_for :projects
和我的项目模型:
class Project < ActiveRecord::Base
attr_accessible :name, :description
has_many :ownerships
has_many :users, :through => :ownerships
答案 0 :(得分:3)
关键是你在点击@project.save
之前建立(而不是创建)关联保存首先保留项目,如果项目成功保留,则也会创建所有权。
def create
@project = Project.new(params[:project])
@project.ownerships.build(:user => current_user, :owner_type => 'chief')
if @project.save
flash[:success] = "Project created!"
redirect_to @project
else
flash[:error] = "Project not created."
end
end
答案 1 :(得分:1)
在我的用户模型中,我允许使用以下行的嵌套属性:
accepts_nested_attributes_for :projects
然后,在我的项目#create controller action中,我在创建用户和新项目之间的关联时嵌套了一个属性,如下所示:
current_user.ownerships.create(:owner_type => 'designer', :project => @project)
说实话,我不确定为什么会这样,但确实如此。对其他人解释它会很棒。