рельсы, создающие модель с несколькими принадлежащими, с attr_accessible - PullRequest
3 голосов
/ 20 января 2012

Мои модели выглядят примерно так:

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

Я пытаюсь выяснить, как лучше всего создать новую рецензию, учитывая, что: user_id и: product_id не являются attr_accessible. Обычно я просто создаю обзор через ассоциацию (@ user.reviews.create) для автоматической установки: user_id, но в этом случае я не уверен, как установить product_id.

Насколько я понимаю, если я выполню @ user.reviews.create (params), все не относящиеся к attr_accessible параметры будут игнорироваться.

Ответы [ 2 ]

2 голосов
/ 20 января 2012

Вы можете сделать:

@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.

1 голос
/ 20 января 2012

Похоже, вы хотели бы реализовать отношение «многие ко многим» между моделью «Пользователь» и «Продукт», при этом модель «Обзор» служит таблицей соединений, чтобы связать их с добавленной строкой комментариев. Это может быть достигнуто с помощью множества через Rails. Начните с чтения Руководства Rails по ассоциациям .

При настройке модели Review добавьте внешние ключи для User и Product:

rails generate model review user_id:integer product_id:integer

И настройте свои ассоциации следующим образом:

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)
...