1

nameというプロパティに一意のインデックスを持つデータマッパーモデルがあります。名前がまだ存在しないときに新しいレコードを作成し、重複した名前のレコードを作成する試みを黙って無視したいと思います。datamapperでこれを行う「正しい」方法は何ですか?

4

4 に答える 4

1

最善のアプローチは、dm-validations gemを使用し、nameプロパティが一意として指定されていることを確認することです。例:

class Committer
  include DataMapper::Resource

  # ... other properties ...

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

dm-validations gemはモデルをイントロスペクトし、プロパティの検証を自動的にセットアップします。この場合、複数のコミッターが同じ名前を持つことはできません。

于 2010-02-25T19:55:29.060 に答える
1

最良の答えはfirst_or_createを使用することだと思います。これは、Danが上で指摘したように、すでに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)
于 2010-03-02T14:51:26.160 に答える
0

これが私が思いついた別の解決策です:

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
于 2010-02-26T06:12:29.583 に答える
0

私が思いついた解決策の1つは、単に例外を無視することです。

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

より良い(より慣用的な)方法がある場合は、私に知らせてください。

于 2010-02-25T13:32:40.403 に答える