1

データベースから新しいユーザーを作成/取得するために、datamapper で次を使用しています。

user = User.first_or_create({:id => data['id']})

これは、id = data['id'] を持つユーザーを取得するか、まだ存在しない場合は作成します。

新しいレコードか既存のレコードかに関係なく、返されたオブジェクトの他の属性/フィールドを設定する方法を知りたいですか?

これを行う唯一の方法は電話user.update({:field => value ...})ですか、それともこれを達成するためのより良い方法はありますか?

4

2 に答える 2

2

まあ、あなたはそれを一行で書くことができます:

(User.first_or_create(:id => data['id'])).update(:field => value)

必要に応じて(または複数を指定する必要がある場合は)パラメーターのハッシュを使用します。first_or_createただし、これは で指定されたモデルが有効な場合にのみ機能することに注意してください。たとえば:name、必須フィールドの場合、これは機能しません。

(User.first_or_create({:id => data['id'], :name => "Morse"})).update(:name => "Lewis")

最初の部分の作成が失敗するためです。

次のような新しいレコードに必要なパラメーターを指定することで、これを回避できます

(User.first_or_create({:id => data['id'], :name => "Morse"}, {:name => "Lewis"})).update(:name => "Lewis")

しかし、これは非常に苦痛であり、読むのが困難です。

first_or_createまた、 withを使用すると、そのようなレコードが存在しない場合、:idその特定の でモデルを作成しようとすることに注意してください。:idこれはあなたが望むものではないかもしれません。

または、 を使用することもできますfirst_or_new。ただし、レコードが存在しないため、これを使用して作成されたオブジェクトを呼び出すことはできませんupdate(ただし、これは以前のバージョンの DataMapper では機能していた可能性があります)。

于 2011-07-13T23:07:57.840 に答える
0

この回答に出くわした人にとっては、 User.first_or_create({:id => data['id']}) は「id = data['id'] でユーザーを取得するか、まだ存在しない場合は作成しません」 ." 実際にはテーブルの最初のレコードを取得し、その id t0 data['id'] を変更します。

その ID を持つ最初のレコードを実際に取得するか、存在しない場合は作成するには、where 句を使用する必要があります。

User.where(id: data['id]).first_or_create
于 2016-07-04T13:33:55.503 に答える