2010-03-18 11 views
123

In questo esempio, creo uno user senza profile, quindi creerò un profile per quell'utente. Ho provato a utilizzare build con un'associazione has_one ma è esplosa. L'unico modo in cui vedo questo funziona utilizzando has_many. Si suppone che lo user abbia al massimo uno profile.Utilizzo di build con un'associazione has_one nei binari

Ho provato questo. Ho:

class User < ActiveRecord::Base 
    has_one :profile 
end 

class Profile < ActiveRecord::Base 
    belongs_to :user 
end 

Ma quando lo faccio:

user.build_profile 

ottengo l'errore:

ActiveRecord::StatementInvalid: Mysql::Error: Unknown column 'profiles.user_id' in 'where clause': SELECT * FROM `profiles` WHERE (`profiles`.user_id = 4) LIMIT 1 

C'è un modo in Rails per avere 0 o 1 associazione?

+0

cosa esattamente hai provato? potresti, per favore, postare del codice? –

risposta

324

Il metodo firma build è diverso per has_one e has_many associazioni.

class User < ActiveRecord::Base 
    has_one :profile 
    has_many :messages 
end 

La sintassi di build per has_many associazione:

user.messages.build 

La sintassi di build per has_one associazione:

user.build_profile # this will work 

user.profile.build # this will throw error 

Leggi il has_one associazione documentation per maggiori dettagli.

+22

La sintassi diversa per l'has_one mi cattura sempre ... dannazione! – Galaxy

+2

Imparare ogni giorno i nuovi (bizzarri) metodi magici ... – tackleberry

+0

@tackleberry, si chiama metaprogramming –

-13

Dovrebbe essere un has_one. Se build non funziona, si può semplicemente utilizzare new:

ModelName.new(:owner => @owner) 

è lo stesso di

@owner.model_names.build 
+10

Non è la stessa cosa: se crei un nuovo nome_prodotto con build, quando @owner viene salvato, verrà salvato anche il nuovo nome_modello. Quindi, puoi usare build per creare un genitore e dei figli che verranno salvati insieme. Questo non è il caso se si crea un nome_modello con .new –

16

Dai un'occhiata al messaggio di errore. E vi sta dicendo che non avete richiesto colonna user_id nella tabella profilo. L'impostazione delle relazioni nel modello è solo una parte della risposta.

È inoltre necessario creare una migrazione che aggiunge la colonna user_id alla tabella di profilo. Rails si aspetta che questo sia lì e se non lo è, non è possibile accedere al profilo.

Per ulteriori informazioni si prega di dare un'occhiata a questo link:

Association Basics

+0

Ho appena capito il mio problema. Il libro che sto imparando non ha spiegato molto bene la creazione di chiavi straniere. Ho creato una nuova migrazione che aggiunge una chiave esterna al mio modello. Grazie. – espinet

+0

Hai bisogno di creare la colonna tu stesso ogni volta? Ho avuto questa idea che è successo automaticamente. Non so dove ho avuto questa idea. – Rimian