2015-05-04 2 views
0

В одной из моих моделей, я звонюfirst_or_initialize вызова блок, даже если строка найдена

puts where(field: value).first 
where(field: value).first_or_initialize.tap do |row| 
     # . . . Actual creation and saving omitted 
end 

Я запустить его несколько раз только, чтобы проверить его, и блок продолжает работать, даже будучи хотя я может ясно видеть, что это не должно быть (потому что puts печатает найденную строку и потому, что в базе есть что-то в основе). Я также знаю, что блок вызывается, потому что у меня есть пропущенный puts, и SQL вызывает обновления.

Почему это? Как я могу это исправить?

+1

['first_or_initialize'] (http://apidock.com/rails/v4.2.1/ActiveRecord/Relation/first_or_initialize) делает именно это. Если он найдет запись, он что-то сделает с ней, иначе она создаст новую запись и что-то с ней сделает. –

ответ

2

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

Model.where(conditions).first_or_initialize do |row| 
    # code 
end 

Более или менее, тот же самый код, но без tap.

+0

О, я вижу. Я не понимал этого ясно, так как я, по сути, нашел этот образец кода. Это имеет смысл, однако, спасибо! –

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