如何在创建关系时动态设置连接模型的属性?

时间:2011-10-16 17:05:49

标签: ruby-on-rails has-many-through

我有一个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

2 个答案:

答案 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)

说实话,我不确定为什么会这样,但确实如此。对其他人解释它会很棒。