Raylar 6
Rails 6 , bu işlevi sağlayan bir upsert
ve upsert_all
yö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_by
veya 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 name
ayarlanmış 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