【问题标题】:How do I set a join model's attribute on the fly when creating a relationship?创建关系时如何动态设置连接模型的属性?
【发布时间】:2013-09-27 17:18:48
【问题描述】:

我有一个 has_many :through 用户和项目之间的关系,通过所有权加入模型。我希望能够在创建用户和新项目之间的关系时设置所有权模型的属性。这是我目前所拥有的:

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

【问题讨论】:

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


    【解决方案1】:

    关键是你在点击@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
    

    【讨论】:

    • 唷,我注意到你的答案不见了,有点吓坏了:)。好的,我会试试这个。我是否需要在任何东西上添加 attr_accessible 才能使其正常工作?比如, :user 到所有权模型?
    • 编辑:也许您可以忽略以下内容,只需按原样尝试 - 因为您没有直接分配 user_id 删除 attr_accessible :owner_type 或添加 @987654325 @ 和 project_id 也是。因为如果您在一个属性上设置attr_accessible,则所有其他属性将无法通过批量赋值访问,除非您明确声明它们可访问。引用:如果任何属性受 attr_protected 或 attr_accessible 保护,则只会分配可设置的属性。
    • 这不起作用。没有抛出错误,但它重定向到 /projects,但它实际上不是 /projects 页面,它是一个 project#create 页面,但它看起来很时髦。该项目也没有保存,所有权模型也没有保存。当我删除 @project.ownerships.build(:user => current_user, :owner_type => 'designer') 时,它会再次正确创建项目,但不会创建所有权(显然)。另外,我删除了所有 attr_accessible 只是为了让它工作。
    • 开始工作了!这就是我所做的:我将构建更改为创建并将其移至 project.save 之后。编辑您的答案以显示它。
    • 是的,主要问题是我为 :owner_type 设置了 attr_accessible,但没有为 :user 和 :project 设置它,这是按照上述方式创建连接模型所必需的。我不知道。谢谢!
    【解决方案2】:

    编辑:这实际上对我不起作用。

    在我的用户模型中,我允许使用这一行嵌套属性:

    accepts_nested_attributes_for :projects
    

    然后,在我的 projects#create 控制器操作中,我在创建用户和新项目之间的关联时嵌套了一个属性,如下所示:

    current_user.ownerships.create(:owner_type => 'designer', :project => @project)
    

    老实说,我不确定为什么会这样,但确实如此。别人解释一下就好了。

    【讨论】:

      最近更新 更多