Обновить атрибуты, если не пусто? - PullRequest
6 голосов
/ 07 октября 2009

У меня есть существующая запись проекта, и я импортирую файл CSV, чтобы обновить связанные атрибуты проекта. Однако часто CSV будет содержать пустые поля, и я не хочу переопределять существующие атрибуты, если соответствующее поле CSV пустое.

Примерно так:

project.update_attributes(:name => row.field('project_name') unless row.field('project_name').blank?,                                             
                          :owner => row.field('project_owner') unless row.field('project_owner').blank?,
                          :due_date => row.field('project_due_date') unless row.field('project_due_date').blank?)

Ответы [ 4 ]

23 голосов
/ 07 октября 2009
project.update_attributes({:name => row.field('project_name'),                                                                         
                          :owner => row.field('project_owner'),
                          :due_date => row.field('project_due_date')}.reject{|k,v| v.blank?})
7 голосов
/ 28 марта 2017

Вы можете сделать это с контроллера , если необходимо:

def some_params
    params.permit(:foo, :bar).reject { |_, v| v.blank? }
end

В этом случае атрибуты не будут сохранены , если они пустые

1 голос
/ 23 февраля 2014

Это старый вопрос, но для записи вы также можете установить атрибут на ноль (в отличие от пустого), чтобы исключить его из списка обновлений. Я бы не назвал следующий пример лучшей практикой, но я думаю, что это может помочь прояснить, что происходит в фоновом режиме: update_attributes будет пытаться обновить только те атрибуты, которые предоставлены в хэше, имеющие значение, отличное от nil.

params[:csv] = nil if params[:csv].blank? or (arbitrary other condition)
# now update like normal
if @project.update_attributes(project_params)
  ...
etc.
0 голосов
/ 07 октября 2009
attrs = [:name,:owner,:due_date].inject({}) {|res,obj| res[obj] = row.field("project_#{obj}") unless row.field("project_#{obj}").blank? }
project.update_attributes attrs
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...