Обновление условной модели — Rails 3.1

#ruby-on-rails #ruby #ruby-on-rails-3

#ruby-on-rails #ruby #ruby-on-rails-3

Вопрос:

У меня есть две таблицы:

хранит raw_stores_data

Данные raw_stores_data ежедневно поступают от третьей стороны.

Я бы обновил определенные поля модели stores, если эти поля были изменены для этой записи в raw_stores_data.

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

 new_data = raw_stores_data.all.select do |item|
   item.store_id.present?
end

new_data.each do |item|
  if item.field1 != item.stores.field1
  ...
  ...
  ...

  # update record with hash of fields to update created above
end
  

Ответ №1:

Вы могли бы добавить ассоциацию и специальные мутаторы к «необработанной» модели, которые знают, как управлять объектом «stores». Это служит для сохранения кода модели в модели. Тонкий контроллер, комплексные модели и т.д.

 class Store < ActiveRecord::Base
  has_one :raw_stores_data
end


class RawStoresData < ActiveRecord::Base
  belongs_to :store

  def field1=(value)
    store.field1 = value
    store.save!
    field1 = value
  end
end
  

Я указываю на некоторые детали, и вы, возможно, захотите изменить направление ассоциации или заставить ее двигаться в обоих направлениях.

Редактировать:

Вы бы использовали это как таковое:

 raw_data = RawStoreData.find(param[:id]) # or new or however you get this object
raw_data.field1 = param[:field1]
  

В процессе присвоения будет использоваться метод ‘field1=’ и вноситься изменение в связанный объект хранилища. Если вы беспокоитесь о ненужном сохранении, вы можете обусловить в этом методе сохранение только в том случае, если значение изменилось.

Я надеюсь, что это понятнее.

Комментарии:

1. Я немного запутался в том, как это будет работать. Вызывает ли rails эту функцию автоматически при создании записи? Кроме того, если у меня есть 1 миллион записей, выполнит ли это 5 миллионов запросов, если у меня будет это для 5 полей?

2. Это просто переопределение / замена оператора присваивания для этого поля. Я добавлю пример использования к этому, чтобы сделать его более понятным.