Raylar 6
Rails 6 , bu işlevi sağlayan bir upsertve upsert_allyöntemi ekledi .
Model.upsert(column_name: value)
[upsert] Herhangi bir modeli somutlaştırmaz veya Aktif Kayıt geri aramalarını veya doğrulamalarını tetiklemez.
Raylar 5, 4 ve 3
Bir "upert" (veritabanının aynı işlemde bir güncelleme veya ekleme ifadesi yürüttüğü) türde bir ifade arıyorsanız değil. Kutudan çıkar çıkmaz, Rails ve ActiveRecord'un böyle bir özelliği yoktur. Bununla birlikte , yükseltici cevheri kullanabilirsiniz .
Aksi takdirde, ek bir veritabanı isabeti pahasına da olsa benzer işlevsellik sunan : find_or_initialize_byveya kullanabilirsiniz find_or_create_by, ki çoğu durumda bu neredeyse hiç sorun teşkil etmez. Bu yüzden ciddi performans endişeleriniz yoksa mücevheri kullanmam.
Örneğin, "Anlaşıldı" adında bir kullanıcı bulunmazsa, "Anlaşıldı" olarak nameayarlanmış yeni bir kullanıcı örneği oluşturulur .
user = User.where(name: "Roger").first_or_initialize
user.email = "email@example.com"
user.save
Alternatif olarak kullanabilirsiniz find_or_initialize_by.
user = User.find_or_initialize_by(name: "Roger")
Raylarda 3.
user = User.find_or_initialize_by_name("Roger")
user.email = "email@example.com"
user.save
Bir blok kullanabilirsiniz, ancak blok yalnızca kayıt yeniyse çalışır .
User.where(name: "Roger").first_or_initialize do |user|
user.save
end
User.find_or_initialize_by(name: "Roger") do |user|
user.save
end
Kaydın kalıcılığına bakılmaksızın bir blok kullanmak istiyorsanız tap, sonucu kullanın :
User.where(name: "Roger").first_or_initialize.tap do |user|
user.email = "email@example.com"
user.save
end