2012-06-10 3 views
3

guid и value. Если существует запись с этим guid, обновите ее value. В противном случае создайте новую запись с данными guid и value. В любом случае верните запись, чтобы я смог получить ее первичный ключ id.Если существует обновление else create. В любом случае вернуть запись

Как сделать это с помощью:

  • как меньше запросов к базе данных, как это возможно
  • как меньше кода, как это возможно

ответ

4

Самое простое, вероятно,

object = Model.find_or_initialize_by_guid(guid) 
object.update_attributes :value => value 

Который всегда делает 2 запросов (находку и вставки/обновления)

Если вы знаете заранее, что столкновения вряд вы могли бы сделать

begin 
    Model.create(:guid => guid, :value => value) 
rescue ActiveRecord::RecordNotUnique 
    # find and update existing record 
end 

Для этого требуется уникальный указатель на столбце guid. Он требует 3 запроса в случае обновления, но только 1 запрос в случае создания.

Все это предполагает, что мы говорим SQL - другие датасторы, такие как MongoDB, есть понятие upsert (обновление или вставка) операция

1

Этот код будет найти какое значение = PARAMS объект [: справ] , Если объект найден, он вернет этот объект, в противном случае он создаст новый объект, но не сохранит его.

your_object = YOU_MODEL.find_or_initialize_by(params[:guid]) 
+0

'guid' это поле, а не модель – powerboy

+0

Не могли бы вы дать свою модель и ваш объект params? –

+0

Я просто отредактировал свой ответ, хотите ли вы этого? –

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