Rails:如何在连接表中创建新条目

时间:2012-08-30 12:54:16

标签: ruby-on-rails many-to-many model-associations

让我们考虑一个实际的例子:一个有很多评论的产品,由客户编写。我们通过评论产品客户端之间建立了多对多关系。

class Product < ActiveRecord::Base
    has_many :reviews
    has_many :clients, :through => :reviews
end

class Client < ActiveRecord::Base
    has_many :reviews
    has_many :products, :through => :reviews
end

class Reviews < ActiveRecord::Base
    belongs_to :product
    belongs_to :client
end

在这里,我使用has_many :through来创建多对多关系,因为 review 表需要有额外的属性,比如分数,内容,喜欢, ...

用户登录我的应用程序,因此我可以通过以下方式获取数据:

client = Client.find_by_id current_user.id

他进入了产品页面,因此我可以获得产品数据:

product = Product.find_by_id params[:id]

如何创建产品的客户评论?

我试过了:

review = Review.create :client => client, :product => product, :comment => params[:review][:comment]

但它给了我: MassAssignSecurity:无法批量分配受保护的属性:产品,客户

有什么想法吗?提前谢谢。

3 个答案:

答案 0 :(得分:2)

创建Review对象并显式传递参数后,您需要在Review模型中访问它们。在这种情况下,它必须是外键

class Reviews < ActiveRecord::Base

    belongs_to :product
    belongs_to :client

    attr_accessible :client_id, :product_id
end

这应该有用,但这是一种不好的做法,会导致安全问题。我建议用以下内容替换review.create,而不是让外键可以访问并在Review.create中显式传递它们。

review = Review.new
review.client = client
review.product = product
review.comment = params[:review][:comment]
review.save

这将创建一个新的Review对象,避免批量分配。 希望这会有所帮助。

答案 1 :(得分:0)

:客户端和:产品属性是私有的,您必须分别在每个类设置attr_accessible :clientattr_accessible :product上访问它们,如:

class Reviews < ActiveRecord::Base
    belongs_to :product
    belongs_to :client

    attr_accessible :client, :product
end

希望这有帮助

答案 2 :(得分:0)

添加到您的模型,其中属性为:product和:client

attr_accessible :product, :client

http://api.rubyonrails.org/classes/ActiveModel/MassAssignmentSecurity/ClassMethods.html