Dalam contoh ini, saya membuat a user
dengan tidak profile
, kemudian membuat profile
untuk pengguna itu. Saya mencoba menggunakan build dengan has_one
asosiasi tetapi itu meledak. Satu-satunya cara saya melihat ini berfungsi adalah menggunakan has_many
. The user
seharusnya hanya memiliki paling banyak satu profile
.
Saya sudah mencoba ini. Saya sudah:
class User < ActiveRecord::Base
has_one :profile
end
class Profile < ActiveRecord::Base
belongs_to :user
end
Tetapi ketika saya melakukannya:
user.build_profile
Saya mendapatkan kesalahan:
ActiveRecord::StatementInvalid: Mysql::Error: Unknown column 'profiles.user_id' in 'where clause': SELECT * FROM `profiles` WHERE (`profiles`.user_id = 4) LIMIT 1
Apakah ada cara di rel untuk memiliki asosiasi 0 atau 1?
Jawaban:
The
build
Metode tanda tangan yang berbeda untukhas_one
danhas_many
asosiasi.Sintaks build untuk
has_many
asosiasi:Sintaks build untuk
has_one
asosiasi:Baca dokumentasi
has_one
asosiasi untuk lebih jelasnya.sumber
user.build_profile
untuk mengedituser.build_profile if user.profile.nil?
dan jika Anda ingin membangun profil saat membuat pengguna kemudian menulisaccepts_nested_attributes_for :profile
ini di Model pengguna. dan dalam bentuk mana pengguna sedang dibuat, tulis<%= f.simple_fields_for :profile do |p| %>
ini dan lanjutkan.build_<association>
) adalah perilaku yang cukup aneh dan tidak terduga di Rails, ada lebih banyak orang yang mencari jawaban ini daripada jawaban pertanyaan yang sebenarnya, jika Anda tahu apa yang saya maksud.Perhatikan baik-baik pesan kesalahan. Ini memberi tahu Anda bahwa Anda tidak memiliki kolom yang diperlukan
user_id
dalam tabel profil . Mengatur hubungan dalam model hanyalah sebagian dari jawabannya.Anda juga perlu membuat migrasi yang menambahkan
user_id
kolom ke tabel profil. Rails mengharapkan ini ada di sana dan jika tidak, Anda tidak dapat mengakses profil.Untuk informasi lebih lanjut silakan lihat tautan ini:
Dasar-Dasar Asosiasi
sumber
rails g model profile user:references:index address:string bio:text
.Tergantung pada kasus penggunaan, akan lebih mudah untuk membungkus metode ini dan secara otomatis membangun asosiasi ketika tidak ditemukan.
sekarang memanggil
#profile
metode akan mengembalikan profil yang terkait atau membuat contoh baru.sumber: Ketika monyet menambal suatu metode, dapatkah Anda memanggil metode yang diganti dari implementasi yang baru?
sumber
def profile; super || build_profile; end
.Itu harus a
has_one
. Jikabuild
tidak berfungsi, Anda bisa menggunakannew
:sama dengan
sumber