Не удается правильно скопировать атрибуты другой модели? - PullRequest
0 голосов
/ 24 марта 2012

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

class Product < ActiveRecord::Base
  attr_accessible :price, :name, :watch_price
  belongs_to :user
  belongs_to :store
  has_many :product_subscriptions, :dependent => :destroy
  has_many :product_subscribers, :through => :product_subscriptions, :class_name => 'User'
end

class ProductSubscription < ActiveRecord::Base
  belongs_to :product
  belongs_to :product_subscriber, :class_name => 'User'
  attr_accessible :watched_price, :watched_name
end

class ProductObserver < ActiveRecord::Observer
 def after_create(product)
   ProductSubscription.new(product.attributes.merge({
       :watched_name => name,  
       :watched_price => price, 
       :store_id => :store_id,
      }))
  end
end

Приведенный выше код успешно создает ProductSubscription с user_id и product_id, но :watched_name и :watched_price не заполнены оригинальными Product :price и :name.

Я заметил, что проблема заключается в этом.Что не имеет никакого смысла, потому что когда я смотрю в базу данных, она присваивается, как я уже упоминал выше:

WARNING: Can't mass-assign protected attributes: product_id

Теперь у меня есть другие поля, которые не относятся к модели Product, которые не 't кроме модели ProductSubscription, так что, может быть, из-за этого все испортилось?

Я не хочу, чтобы product_id можно было назначать по массе.Как я мог это исправить?

1 Ответ

2 голосов
/ 24 марта 2012

Ваши хеш-значения должны ссылаться на методы атрибута, а не на некоторые символы. Таким образом, вызывается метод, возвращающий значение соответствующего атрибута, и значение вставляется в хеш. Символы, которые вы использовали, не имеют никакого значения.

ProductSubscription.new(product.attributes.merge({
    :watched_name => name,
    :watched_price => price, 
    :store_id => store_id,
  }))
end

Кроме того, вы, похоже, не сохраняете свой новый ProductSubscription. Простой вызов new не сохранит объект в базе данных. Вместо этого используйте что-то вроде create.

И, наконец, как сказал Эндрю Маршалл, дизайн вашей базы данных не совсем оптимален. Копирование целых строк таблицы не даст большой производительности. Вместо этого вы скоро будете страдать от несоответствий и проблем с поддержанием актуальности всех скопированных данных. Вы действительно должны узнать о соединениях и понятиях нормализации базы данных

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...