Rails: сохранение записи, если она имеет уникальное значение? - PullRequest
1 голос
/ 25 марта 2011

Я, вероятно, ищу здесь не ту вещь, и я тупой, поэтому позвольте мне объяснить.

У меня есть задача rake, которая опрашивает веб-сервис каждые 10 минут через cron, ответ:JSON.

Для каждого из элементов в ответе мне нужно создать запись, только если определенный столбец имеет уникальное значение, в данном случае это хеш.

Вот основная частьtask:

response.parsed_response['items'].each do |item|
  Item.create({
    :item_hash => item['item_hash']
  })
end

Дело в том, что я хочу сделать это, только если значение hash уникально, это элементарное поведение или я пропускаю какой-то очевидный метод в ActiveRecord?

Ответы [ 2 ]

2 голосов
/ 25 марта 2011

Использование find_or_create

Item.find_or_create_by_item_hash(item['item_hash'])

Если данные уже существуют Элемент не создан.

Если вы обрабатываете много записей, я бы использовал следующий подход:

all_hashes = response.parsed_response['items'].map{|item| item['item_hash']}
new_hashes = all_hashes - Item.all(:select => :item_hash, 
               :conditions => {:item_hash => all_hashes}).map(&:item_hash)
Item.create(new_hashes.map{|hash| {:item_hash => hash}})
1 голос
/ 25 марта 2011

Если вы хотите пойти по маршруту Railsy, ​​тогда валидации ActiveRecord - это то, что вам нужно, как предложил Pan Thomakos. Нет ничего плохого в использовании ActiveRecord с неформальными данными; AR не знает (или не заботится), откуда поступают данные.

Также существует SQL-маршрут: вы можете связать уникальный индекс с INSERT IGNORE, и ваши значения будут вставлены, только если они уникальны. Если вам нужно узнать, была ли вставка успешной, вы можете убить IGNORE и использовать спасательный блок (вы также можете получить значение «# row changes» обратно из MySQL, но я не уверен, как это сделать). это в Rails).

Надеюсь, это поможет!

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