[解決済み] Railsは魔法を作ったり、更新したりするのか?
質問
というクラスがあります。
CachedObject
というクラスがあり、キーでインデックス化された一般的なシリアル化されたオブジェクトを格納しています。このクラスには
create_or_update
メソッドを実装したい。オブジェクトが見つかったらそれを更新し、そうでなければ新しいものを作成します。
Railsでこれを行う方法はありますか?それとも自分でメソッドを書かなければなりませんか?
どのように解決するのですか?
Rails 6
Rails 6では
upsert
と
upsert_all
メソッドがあり、この機能を提供します。
Model.upsert(column_name: value)
[upsert] モデルをインスタンス化することも、Active Recordコールバックや検証を起動することもありません。
Rails 5、4、および3
upsert"(データベースが同じ操作でupdateまたはinsert文を実行する)タイプの文を探している場合は違います。RailsとActiveRecordには、そのような機能はありません。そのため upsert gemを使うことができます。
でなければ、使えるのは
find_or_initialize_by
または
find_or_create_by
などがあり、これらは似たような機能を提供しますが、追加のデータベースヒットの代償として、ほとんどの場合、ほとんど問題にはなりません。そのため、深刻なパフォーマンス上の懸念がない限り、私はこの gem を使用しません。
例えば、Roger" という名前のユーザが見つからなかった場合、新しいユーザインスタンスが
name
を"Roger"に設定します。
user = User.where(name: "Roger").first_or_initialize
user.email = "[email protected]"
user.save
あるいは
find_or_initialize_by
.
user = User.find_or_initialize_by(name: "Roger")
Rails 3では。
user = User.find_or_initialize_by_name("Roger")
user.email = "[email protected]"
user.save
ブロックを使っても良いですが の場合のみ、ブロックが実行され、レコードが新しい .
User.where(name: "Roger").first_or_initialize do |user|
# this won't run if a user with name "Roger" is found
user.save
end
User.find_or_initialize_by(name: "Roger") do |user|
# this also won't run if a user with name "Roger" is found
user.save
end
レコードの永続性に関係なくブロックを使いたい場合は
tap
を結果上で使用します。
User.where(name: "Roger").first_or_initialize.tap do |user|
user.email = "[email protected]"
user.save
end
関連
-
[解決済み】bcrypt LoadError: Cannot load such file
-
[解決済み] Ruby on Railsのためにnetbeansを構成する方法は?
-
[解決済み] Railsマイグレーションを利用してカラムをドロップする方法
-
[解決済み] Ruby on Railsのマイグレーションでデータベースのカラムの名前を変更するにはどうすればよいですか?
-
[解決済み] Ruby on Railsで現在の絶対URLを取得するにはどうすればよいですか?
-
[解決済み] Ruby/RailsでHashからキーを削除して残りのHashを取得する方法は?
-
[解決済み] 実行時にメソッドが定義されている場所を見つけるには?
-
[解決済み】Railsの認証トークンを理解する
-
[解決済み】強いパラメータを持つ配列を許可する方法
-
[解決済み】Rails: #update_attributeと#update_attributesの比較
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】修正方法:エラー:'<ファイル名>'にチェックアウトされたコミットがない fatal: コマンドプロンプトで "git add ." を入力するとファイルの追加に失敗する
-
[解決済み】取得中。「プロジェクトのクローンとマイグレート後に、「マイグレーションは保留中です。この問題を解決するには 'bin/rake db:migrate RAILS_ENV=development' を実行してください。
-
[解決済み] Railsサーバーがポートはすでに使用されていると言う、そのプロセスを殺すにはどうすればよいですか?
-
[解決済み】コレクションをDESCで並べる方法
-
[解決済み] Rails のインストールに失敗する: activesupport には Ruby のバージョン >= 2.2.2 が必要です。
-
[解決済み] erbでコメントを追加する最適な方法
-
[解決済み] nil:NilClass の未定義メソッド `each' - しかし、なぜ?
-
[解決済み] Ruby:Rubyの配列にinclude.の反対はある?
-
[解決済み] 属性を割り当てる場合、引数としてハッシュを渡す必要がある
-
[解決済み] 構文エラー "構文エラー、予期しない入力終了、keyword_endを期待 (SyntaxError)"