1

多くのアイテムを持つユーザー モデルがあります。評価はユーザーとアイテムに属します。

DB で、ratings.user_id を NULL 以外に設定しました。

私がアイテムを作成しているとき、私はこれをしたいと思います:

  def create
    current_user.items.create(params[:item]).ratings.create(params[:rating]
    redirect_to items_path
  end

ただし、これはSQLエラー「user_id cannot be nil」で中断します

だから私は create メソッドを次のように書き直しました

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

これは正常に動作します。

ただし、現在のユーザーのレシーバーから create メソッドを連鎖させると、評価の user_id が取り込まれてしまうと考えていました。なぜだか知っている人はいますか?

ティア。

4

3 に答える 3

1

可能であれば、データベースでこれを正規化することをお勧めします。評価テーブルから user_id 属性を取り出して、モデルでそれが必要な場合は、:through メソッドを使用して結合を介して取得します。

class Rating
    has_many :items
    has_one :user, :through=>:items
于 2009-02-05T21:50:57.450 に答える
1

アイテムを作成して保存し、そのアイテムから評価を作成した場合、ユーザーは評価に渡されませんよね? @rating.item.user と呼ぶだけですよね?

そのように考えると、 current_user を介して作成されたアイテムがユーザー情報を評価に渡すとは思わないでしょう。

ユーザーの has_many 評価関係が本当に必要かどうか疑問に思います。

于 2009-02-05T21:54:58.020 に答える
0

アイテムには多くの評価があり、その関連付けはユーザー ID を認識していないためです。アソシエーション チェーン Item はユーザーに属しているため、ユーザー ID を持つことになります。また、評価はアイテムに属しているため、アイテム ID を持ちます。しかし、Item to Rating アソシエーションは、あなたが知らせない限り、ユーザーについて何も知りません。

于 2009-02-05T21:43:46.077 に答える