rails使用attr_accessible创建具有多个belongs_to的模型

时间:2012-01-20 04:46:20

标签: ruby-on-rails belongs-to

我的模型看起来像这样:

class User < ActiveRecord::Base
    attr_accessible: :name

    has_many :reviews   
end

class Product < ActiveRecord::Base
    attr_accessible: :name

    has_many :reviews   
end

class Review < ActiveRecord::Base
    attr_accessible: :comment

    belongs_to :user    
    belongs_to :product
    validates :user_id, :presence => true
    validates :product_id, :presence => true
end

我试图找出创建新评论的最佳方法,因为:user_id和:product_id不是attr_accessible。通常,我会通过关联(@ user.reviews.create)创建审核以自动设置:user_id,但在这种情况下,我不确定如何设置product_id。

我的理解是,如果我执行@ user.reviews.create(params),将忽略所有非attr_accessible参数。

2 个答案:

答案 0 :(得分:2)

你可以这样做:

@user.reviews.create(params[:new_review])

......或类似的。您还可以使用嵌套属性:

class User < ActiveRecord::Base
  has_many :reviews
  accepts_nested_attributes_for :reviews
  ...

请参阅http://api.rubyonrails.org/classes/ActionView/Helpers/FormHelper.html上的“嵌套属性示例”。

答案 1 :(得分:1)

您似乎希望在用户和产品模型之间实现多对多关系,并使用Review模型作为连接表,将两者与添加的注释字符串连接起来。这可以通过Rails中的许多通过关联来实现。首先阅读Rails Guides on Associations

设置Review模型时,请为UserProduct添加外键:

rails generate model review user_id:integer product_id:integer

按如下方式设置关联:

class User < ActiveRecord::Base
  has_many :reviews
  has_many :products, through: :reviews
end

class Product < ActiveRecord::Base
  has_many :reviews
  has_many :users, through: :reviews
end

class Review < ActiveRecord::Base
  # has comment string attribute
  belongs_to :user
  belongs_to :product
end

这将允许您拨打电话,如:

user.products << Product.first
user.reviews.first.comment = 'My first comment!'

以下是制作评论的方法:

@user = current_user
product = Product.find(params[:id])
@user.reviews.create(product: product)