2013-04-29 4 views
9

Sto cercando di aggiungere una nuova voce nel mio database per un modello che ha un rapporto belongs_to. Ho 2 modelli, lavori e clienti.Ruby on Rails: Creazione di una voce di modello con un'associazione belongs_to

È stato abbastanza facile trovare un tutorial su come impostare l'associazione tra questi due (utilizzando has_many e belongs_to), ma non riesco a trovare esempi in cui l'associazione sia effettivamente utilizzata.

Nel mio codice, sto cercando di creare un nuovo lavoro per il primo cliente. Il modello di lavoro ha un attributo per client_id, e so che probabilmente posso semplicemente riempire manualmente l'attributo, ma ci deve essere qualche convenzione rubino per farlo facilmente.

Posso inserirlo facilmente nel mio codice, ma mi sento come se Ruby avesse un modo migliore per farlo. Ecco come sono configurati i miei modelli

class Job < ActiveRecord::Base 
    attr_accessible :actual_time, :assigned_at, :client_id, :completed_at, :estimated_time, :location, :responded_at, :runner_id, :status, :subject, :description 
    belongs_to :client 
end 

class Client < User 
    has_many :jobs 
end 

class User < ActiveRecord::Base 
    attr_accessible :name, :cell, :email, :pref 

end 
+0

'client = Client.new; Job.create (: client => client,: subject => "Test",: description => "Questo è un test") ' – tessi

risposta

12

basta chiamare create sulla raccolta jobs del cliente:

c = Client.find(1) 
c.jobs.create(:subject => "Test", :description => "This is a test") 
+1

Bad, genererebbe ActiveRecord :: RecordNotFound se non ci sono voci con id = 1 .... usa 'Client.find (: first)' o 'Client.first' – MrYoshiji

+3

@MrYoshiji sollevare un'eccezione è solitamente il comportamento previsto poiché nelle rotaie le eccezioni di "RecordNotFound" sono tradotte in 404 richieste nell'app delle eccezioni. – alf

+0

grazie mi sembra che questa soluzione sia la migliore. – user2158382

-3

Per creare nuove istanze è possibile utilizzare le fabbriche. Per questo si può semplicemente utilizzare factorygirl https://github.com/thoughtbot/factory_girl

Quindi, dopo aver definito il soewhat fabbrica in questo modo:

FactoryGirl.define fare fabbrica: lavoro fare cliente FactoryGirl.create (: client) soggetto 'Test' descrizione 'This is a Test'

Si potrebbe quindi chiamare FactoryGirl.create (: processo) per generare un nuovo lavoro come quello. Si potrebbe anche chiamare FactoryGirl.build (: lavoro, cliente: aClientYouInstantiatedBefore, soggetto: 'AnotherTest') ed anche sovrascrivere eventuali altri attributi

Factores sono buoni se si desidera creare molti oggetti, che sono simili in un certo modo .

+1

Da nessuna parte nella sua domanda, ha detto che vuole farlo per le specifiche. – kiddorails

+0

puoi usare le fabbriche ovunque, non solo nelle specifiche o nei test – MentholBonbon

+6

se stai usando factory girl per lo sviluppo, stai sbagliando. – Senjai

1

È possibile passare l'oggetto come argomento per creare il lavoro:

client = Client.create 
job = Job.create(client_id: client.id, subject: 'Test', description: 'blabla') 

Il metodo create genererà un errore se la l'oggetto non è valido per il salvataggio (se si impostano le convalide come nome obbligatorio, ecc.).

+0

funziona solo se 'client' è contrassegnato come' attribute_accessible' – alf

+0

corretto, grazie per il commento @alfonso – MrYoshiji

+0

anche questo funziona, ma mi piace l'altra sintassi meglio. – user2158382

1

passare l'oggetto stesso come un argomento, invece di passare suo ID. Cioè, invece di passare :client_id => 1 o :client_id => client.id, passare :client => client.

client = Client.find(1) 
Job.create(:client => client, :subject => "Test", :description => "This is a test") 
0

È possibile utilizzare create_job in questo modo:

client = Client.create 
job = client.create_job!(subject: 'Test', description: 'blabla') 

Quando si dichiara un'associazione belongs_to, la classe dichiarando guadagna automaticamente cinque metodi relativi all'associazione:

association 
association=(associate) 
build_association(attributes = {}) 
create_association(attributes = {}) 
create_association!(attributes = {}) 

In tutto Di questi metodi, l'associazione viene sostituita con il simbolo passato come primo argomento a belongs_to.

altro: http://guides.rubyonrails.org/association_basics.html#belongs-to-association-reference