#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. Это просто переопределение / замена оператора присваивания для этого поля. Я добавлю пример использования к этому, чтобы сделать его более понятным.