2012-01-20 6 views
3

私のモデルは、このようなものを見て、複数のbelongs_toのでモデルを作成:USER_IDと::PRODUCT_ID私はことを考えると、最良の方法は、新しいレビューを作成することが何であるかを把握しようとしていますレールattr_accessible

class User < ActiveRecord::Base 
    attr_accessible: :name 

    has_many :reviews 
end 

class Product < ActiveRecord::Base 
    attr_accessible: :name 

    has_many :reviews 
end 

class Review < ActiveRecord::Base 
    attr_accessible: :comment 

    belongs_to :user  
    belongs_to :product 
    validates :user_id, :presence => true 
    validates :product_id, :presence => true 
end 

をattr_accessibleではありません。通常は、:user_idを自動的に設定するためのアソシエーション(@ user.reviews.create)を使ってレビューを作成しますが、この場合はproduct_idの設定方法もわかりません。

@ user.reviews.create(params)を実行すると、attr_accessible以外のすべてのパラメータは無視されます。

+0

これについてもっと考えると、レビュークラスのproduct_idはレビュークラスでattr_accessibleである必要があります。ユーザーはウェブフォームからレビュー対象の商品を選択する必要があるためです。 –

答えて

1

UserモデルとProductモデルの間に多対多リレーションシップを実装したい場合は、レビューモデルをジョインテーブルとして使用し、2つのコメントストリングを追加することができます。これは、Railsで多数の関連を持つことで実現できます。最初にRails Guides on Associationsを読んでください。次のように

rails generate model review user_id:integer product_id:integer 

をそして、あなたの関連付けを設定します:あなたのReviewモデルを設定する際

UserProductのための外部キーを追加します。これは、あなたが呼び出しなどを行うことができます

class User < ActiveRecord::Base 
    has_many :reviews 
    has_many :products, through: :reviews 
end 

class Product < ActiveRecord::Base 
    has_many :reviews 
    has_many :users, through: :reviews 
end 

class Review < ActiveRecord::Base 
    # has comment string attribute 
    belongs_to :user 
    belongs_to :product 
end 

次のとおりです。

user.products << Product.first 
user.reviews.first.comment = 'My first comment!' 

@user = current_user 
product = Product.find(params[:id]) 
@user.reviews.create(product: product) 
+0

私は実際に製品との間に多対多の関係は必要ないので、私は "has_many:products、through::reviews"と "has_many:users、through::reviews"ビットを必要とは思わないユーザー。製品をレビューできるユーザーが必要なだけなので、各レビューはユーザーと製品に属している必要があります。 あなたの回答にはsytaxのビットがありますが、わかりません。 @ user.reviews.create(製品:製品) product_idがattr_accessibleではないのに、product_idがまだ入力されますか? –

2

あなたが行うことができます:あなたはどのように審査を作成します

@user.reviews.create(params[:new_review])

...または類似。また、ネストされた属性を使用することができます。

class User < ActiveRecord::Base 
    has_many :reviews 
    accepts_nested_attributes_for :reviews 
    ... 

http://api.rubyonrails.org/classes/ActionView/Helpers/FormHelper.htmlの「ネストされたが、例の属性」を参照してください。

+0

ハイ・ポール。 params [:new_review]が最初の提案のどこから来たのか説明できますか? –

+0

fields_forブロックから、または手書き入力の単なるセット(すなわち、f.text_fieldの代わりにtext_field_tag)。つまり、自分のレビューフィールドをロールバックします。しかし、おそらくネストされた属性が必要になります:fields_for + accepts_nested_attributes_for。 –