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