class Agents << ActiveRecord::Base
belongs_to :customer
belongs_to :house
end
class Customer << ActiveRecord::Base
has_many :agents
has_many :houses, through: :agents
end
class House << ActiveRecord::Base
has_many :agents
has_many :customers, through: :agents
end
Bagaimana cara menambahkan Agents
model Customer
?
Apakah ini cara terbaik?
Customer.find(1).agents.create(customer_id: 1, house_id: 1)
Di atas berfungsi dengan baik dari konsol namun, saya tidak tahu bagaimana mencapai ini dalam aplikasi sebenarnya.
Bayangkan sebuah formulir diisi untuk pelanggan yang juga mengambil house_id
masukan. Lalu apakah saya melakukan hal berikut di pengontrol saya?
def create
@customer = Customer.new(params[:customer])
@customer.agents.create(customer_id: @customer.id, house_id: params[:house_id])
@customer.save
end
Secara keseluruhan saya bingung bagaimana cara menambahkan catatan di has_many :through
tabel?
Jawaban:
Saya pikir Anda cukup melakukan ini:
Atau saat membuat rumah baru untuk pelanggan:
Anda juga dapat menambahkan melalui id:
sumber
build
pertamacreate
?<<
operator melakukan penyisipan dua kali dalam kasus tertentu. Jadicreate
metode adalah cara terbaik.'Cara terbaik' tergantung pada kebutuhan Anda dan apa yang dirasa paling nyaman. Kebingungan berasal dari perbedaan perilaku ActiveRecord ini dari
new
dancreate
metode dan<<
operator.The
new
Metodenew
tidak akan menambahkan catatan asosiasi untuk Anda. Anda harus membuatHouse
danAgent
mencatat sendiri:Perhatikan bahwa
@cust.houses.new
danHouse.new
secara efektif sama karena Anda perlu membuatAgent
rekaman dalam kedua kasus.The
<<
OperatorSeperti yang disebutkan Mischa, Anda juga bisa menggunakan
<<
operator pada collection. Ini hanya akan membangunAgent
model untuk Anda, Anda harus membangunHouse
model:The
create
Metodecreate
akan membangun keduanyaHouse
danAgent
record untuk Anda, tetapi Anda perlu menemukanAgent
modelnya jika Anda ingin mengembalikannya ke view atau api:Sebagai catatan terakhir, jika Anda ingin pengecualian dimunculkan saat membuat
house
gunakan operator bang sebagai gantinya (misalnyanew!
dancreate!
).sumber
agent = @cust.houses.find(house.id)
dibacaagent = @cust.agents.find(house.id)
? Theagent
variabel dalam "Metode baru" ini berbeda denganagent
pada contoh terakhir. Mungkin membuat kebingungan bagi orang yang bekerja dengan atribut tambahan di tabel gabungan.Cara lain untuk menambahkan asosiasi adalah dengan menggunakan kolom kunci asing:
Atau gunakan nama kolom yang tepat, dengan meneruskan ID dari record terkait, bukan record.
sumber