2016-06-27 2 views
0

Я нахожусь в процессе изменения некоторых функциональных возможностей и, как таковой, я хочу использовать find_or_initialize_by заменить newМогу ли я заполнить/обновить новую запись после использования find_or_initialize_by с одной строкой, например, при использовании new()?

Мой модальный имеет 13 столбцов

modal = Modal.new(col1: col1, col2: col2..... col13: col13) 

Новый код:

modal = Modal.find_or_initialize_by(col1: col1, col3: col3) 

, и теперь мне нужно либо заполнить, либо обновить оставшиеся 11 столбцов.

Можно ли это сделать на одной линии? Я предпочел бы не написать:

modal.col1 = col1 
modal.col2 = col2 
.... 
modal.col13 = col13 

Благодарности

ответ

2

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

modal = Modal.find_or_initialize_by(col1: col1, col3: col3) do |record| 
    record.col4 = col4 
    record.col5 = col5 
    # etc 
end 

Вы можете играть с его синтаксисом oneline его, используя #attributes=:

modal = Modal.find_or_initialize_by(col1: col1, col3: col3) { |r| r.attributes = { col4: col4, col5: col5 } } 

Обратите внимание, что #attributes= будет только установить значение, вы должны сохранить вручную. Если вы используете .find_or_create_by вместо .find_or_initialize_by, он будет проверять и сохранять новую запись после выполнения блока.

Если вы хотите установить атрибуты записи, независимо от того, это новое или нет:

modal = Modal.find_or_initialize_by(col1: col1, col3: col3) 
modal.attributes = { col4: col4, col5: col5 } 

Вы также можете использовать #update_attributes, но ваша запись будет подтверждена и сохранены.

modal = Modal.find_or_initialize_by(col1: col1, col3: col3) 
modal.update_attributes(col4: col4, col5: col5) 
+1

Благодарим за помощь, которая выглядит намного приятнее! –

+0

Мне пришлось отменить это в качестве ответа. Блок вызывается только при создании новой записи, поэтому он не будет обновлять существующую. –

+0

О! Я не знал, что вам нужно установить атрибуты для всех записей, новых или существующих. Я отредактирую ответ :) –

Смежные вопросы