2011-10-05 14 views
5

Sto seguenti http://railscasts.com/episodes/102-auto-complete-associationRails 3 find_or_create_by

tutto sembra bene. Sto cercando di creare una fattura e anche un cliente al volo. Funziona. Tutto a posto.

cliente belongs_to conto fattura belongs_to conto fattura belongs_to cliente

Buuut, entrambi i modelli (client e fattura) hanno un attributo obbligatorio: ACCOUNT_ID.

Quando sto cercando di creare un nuovo cliente al volo ottengo un errore :client_id: - can't be blank

Il motivo sto ottenendo questo errore è perché un cliente non può essere creato perché è che richiede un ACCOUNT_ID nel Modello del cliente Se rimuovo questa riga validates :account_id, :presence => true nel modello Client, la fattura viene aggiunta ma il Cliente non ha account_id.

io ho questo clients_controller.rb nell'azione creare per impostare un valore predefinito @client.account_id = current_user.account_id

invoice.rb

validates :account_id, :presence => true 
validates :client_id, :presence => true 

def client_name 
    client.name if client 
end 

def client_name=(name) 
    self.client = Client.find_or_create_by_name(name) unless name.blank? 
end 

risposta

4

controllo queste rivalutazioni sul ActiveRecord Query interfaccia per Rails 3. x:

http://guides.rubyonrails.org/active_record_querying.html (vedere la sezione "15 Dynamic Finders")

http://m.onkey.org/active-record-query-interface

È necessario creare prima l'account, quindi il client, quindi la fattura, altrimenti le convalide falliranno.

E 'meglio per creare il cliente e la fattura attraverso i loro genitori, per es .:

a = Account.find(current_user.account_id) 

c = a.clients.create(:name => "new client") 
a.save # better "save" than sorry ;-) 

c.invoices.create(:invoice_date => Time.now) 
c.save 

io consiglierei di giocare con questo nel vostro database di sviluppo utilizzando console rotaie, in modo da ottenere una sensazione di esso.

+0

L'account è già stato creato. L'utente che ha effettuato l'accesso ha già un account_id e può accedere come questo 'current_user.account_id'. Il problema è ottenere lo stesso account_id nel nuovo record del client. In questo momento giocherò con il tuo codice. – leonel

+2

Ho questo nel mio modello di fattura 'def organization_name = (name); self.organization = Organization.find_or_create_by_name (name); a meno che name.blank ?; fine' Non è possibile accedere a current_user in un modello. – leonel

+0

se crei il nuovo record del client a partire dal record dell'account, erediterà il suo account_id ... vedi sopra. – Tilo