Как игнорировать повторяющиеся вставки с помощью datamapper - PullRequest
1 голос
/ 25 февраля 2010

У меня есть модель datamapper, которая имеет уникальный индекс для свойства с именем name. Я хочу создавать новые записи, когда имя еще не существует, и молча игнорировать попытки создания записей с повторяющимися именами. Какой «правильный» способ сделать это в datamapper?

Ответы [ 4 ]

1 голос
/ 02 марта 2010

Я думаю, что лучший ответ - использовать first_or_create, который, как указывает Дэн выше, уже встроен в datamapper и поэтому не нуждается в объявлении.

require 'dm-core'
require 'dm-validations'

class Committer
  include DataMapper::Resource
  property :id, Serial
  property :name, String, :unique_index => true
  validates_present :name
  validates_is_unique :name
end
committer = "George"
record = Committer.first_or_create(:name => committer)
1 голос
/ 25 февраля 2010

Наилучший подход - использовать гем dm-validations и убедиться, что свойство name указано уникальным, например:

class Committer
  include DataMapper::Resource

  # ... other properties ...

  property :name, String, :length => 1..100, :required => true, :unique => true
end

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

0 голосов
/ 26 февраля 2010

Вот еще одно решение, которое я придумал:

require 'dm-core'
require 'dm-validations'
require 'dm-more'
record = Committer.find_or_create(:name => committer)

Если вы используете это в sinatra, то, вероятно, требуется dm-more другие проблемы Мое решение состояло в том, чтобы потребовать мой собственный файл, который только содержал следующий код:

module DataMapper
 module Model
   def first_or_create(conditions = {}, attributes = {})
     first(conditions) || create(conditions.merge(attributes))
   end

   alias find_or_create first_or_create
 end
end
0 голосов
/ 25 февраля 2010

Одно решение, которое я придумал, - просто игнорировать исключение:

  begin
    Committer.create!(:name => committer)
  rescue DataObjects::IntegrityError => e # ignore duplicate inserts
  end

Если у вас есть лучший (более идиоматический) способ сделать это, пожалуйста, дайте мне знать.

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