为什么这个关联的创建调用不起作用?

时间:2009-02-05 21:29:33

标签: ruby-on-rails controller associations method-chaining

我有一个包含许多项目的用户模型。评级属于用户和项目。

在DB中,我将ratings.user_id设置为非NULL。

当我创建一个Item时,我想这样做:

  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 

工作正常。

但是,我原本以为将当前用户接收器的创建方法链接起来就会填充评级的user_id。任何人都知道为什么不呢?

TIA。

3 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

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

当你这样想时,你不会指望通过current_user创建的Item将用户信息传递给评级。

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

答案 2 :(得分:0)

因为Item有很多评级,并且该关联不知道用户ID。鉴于该关联链项具有用户ID,因为它属于用户。评级会有一个项目ID,因为它属于一个项目。但是除非你说出来,否则物品到评级关联对用户一无所知。