ruby-on-rails - rails : How to create a new entry in the join table

标签 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:无法批量分配 protected 属性:产品、客户端

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

最佳答案

一旦您创建了 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 对象,避免批量分配。 希望这会有所帮助。

关于ruby-on-rails - rails : How to create a new entry in the join table,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12197329/

相关文章:

ruby-on-rails - Rails 请求规范 - 未定义方法 `body' for nil :NilClass (rswag)

mysql - 多对多映射的 SQL 查询

ruby-on-rails - Rails - 创建回调和嵌套属性后的执行顺序

database - sequelize 返回手动定义的连接表的关联

javascript - 获取嵌套的BelongsToMany关联

javascript - rails 5 : update action not working for AJAXified form

mysql - Ruby on Rails : "SELECT" MySQL command

ruby-on-rails - 自定义验证 :on => :create not working

mysql - 如何查询多对多?

mysql - MySQL 新手寻找多对多关系查询