Rails обновляет только пустые поля - PullRequest
9 голосов
/ 08 февраля 2012

в последнее время мне не очень повезло с ответами в Stackoverflow (я думаю, что я король награды вьюнок), но здесь все равно:

Как я могу обновить только пустые поля при использовании activeRecord?У меня есть этот код:

master_info.update_attributes( {:originalTitle => slave_info.originalTitle,                                                                         
:starring => slave_info.starring,
:theatrical => slave_info.theatrical }

И хотелось бы что-то вроде:

master_info.update_attributes( {:originalTitle => slave_info.originalTitle, if !master_info.originalTitle.present?                                                                        
:starring => slave_info.starring, if !master_info.starring.present?
:theatrical => slave_info.theatrical if !master_info.theatrical.present? }

Я мог бы сделать это по одной строке за раз, но я пытаюсь избежать этого:

master_info.update_attributes(:originalTitle => slave_info.originalTitle) if !master_info.originalTitle.present?

Я прочитал что-то вроде:

master_info.update_attributes( {:originalTitle => slave_info.originalTitle,                                                                         
                          :starring => slave_info.starring,
                          :theatrical => slave_info.theatrical }.reject{ |key, value| value.present?} )

Но это не работает, ничего не обновляет, даже пустые поля.

На самом деле, было бы идеально, если бы вам не приходилось повторять имена полей, поскольку все они названы одинаково как в ведущем, так и в ведомом устройствах, но я не могу сделать .each для activeRecord.Но это вторичная проблема, основной является обновление пустых полей.

Здесь надеемся, что этот не получит перекати:)

Ответы [ 2 ]

9 голосов
/ 25 июня 2013

Чуть позже здесь, но подумал, что я добавлю, как я это сделал, на случай, если кто-то найдет это полезным.

Я использовал функцию в первом ответе и изменил ее ниже.Как сказал @ksol в своем комментарии, вы, вероятно, захотите оставить оригинальный метод update_attributes как есть, поэтому я добавил этот метод в свою модель.Я уверен, что он может быть включен глобально, если вы хотите его для нескольких моделей.

def update_attributes_only_if_blank(attributes)
    attributes.each { |k,v| attributes.delete(k) unless read_attribute(k).blank? }
    update_attributes(attributes)
end

Это удаляет любые атрибуты из хэша, если у него уже нет значения.Затем он обновляет остальные атрибуты как обычно.

0 голосов
/ 08 февраля 2012

Вы можете переопределить атрибуты update_attributes в вашей модели чем-то вроде этого

def update_attributes(attributes)
  attributes.each{|attr| attributes.delete(attr) unless read_attribute(attr).empty?}
  super(attributes)
end

Я не проверял этот код, тогда могут потребоваться корректировки.

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