Ruby on rails 为什么';这不是相关的创建呼叫工作吗?

Ruby on rails 为什么';这不是相关的创建呼叫工作吗?,ruby-on-rails,controller,associations,method-chaining,Ruby On Rails,Controller,Associations,Method Chaining,我有一个用户模型,它有很多项。评级属于用户和项目 在DB中,我已将ratings.user_id设置为非空 创建项目时,我希望执行以下操作: def create current_user.items.create(params[:item]).ratings.create(params[:rating] redirect_to items_path end 但是,这会遇到一个SQL错误“user_id不能为零” 因此,我将create方法重写为 def creat

我有一个用户模型,它有很多项。评级属于用户和项目

在DB中,我已将ratings.user_id设置为非空

创建项目时,我希望执行以下操作:

  def create
    current_user.items.create(params[:item]).ratings.create(params[:rating]
    redirect_to items_path
  end
但是,这会遇到一个SQL错误“user_id不能为零”

因此,我将create方法重写为

  def create
    current_user.items.create(params[:item]).ratings.create(params[:rating].merge({:user_id => current_user}))
    redirect_to items_path
  end 
这很好用

然而,我原以为将create方法与当前用户的接收者链接会填充评级的用户id。有人知道为什么吗


TIA。

因为项目有很多评级,而该关联不知道用户id。给定关联链项目将具有用户id,因为它属于用户。评级将有一个项目id,因为它属于一个项目。但是,除非你告诉它,否则评级协会的项目对用户一无所知。

如果可能的话,我建议你在数据库中对此进行规范化。也许可以从ratings表中删除user_id属性,如果您在模型中需要它,可以使用:through方法通过连接获得它

class Rating
    has_many :items
    has_one :user, :through=>:items

如果您创建并保存了该项目,然后根据该项目进行评分,则不会将用户传递给评分,对吗?您只需将其称为@rating.item.user,对吗

当您这样想时,您不会期望通过当前用户创建的项目将用户信息传递给评级


让我想知道你是否真的需要用户有很多评级关系。

谢谢Jeremy。我来试试这个。我意识到这是一个新手问题。只是想知道:评级不属于一个项目,没有很多项目吗?是的,你是对的,我没有考虑太多,我只是想给你一行:通过例子我会做有很多:项目,:通过=>:评级。。。除非有原因。