2011-10-05 16 views
5

que sigo http://railscasts.com/episodes/102-auto-complete-associationRails 3 find_or_create_by

todo parece estar bien. Estoy intentando crear una factura y también un cliente sobre la marcha. Funciona. Todo bien.

cliente belongs_to cuenta factura belongs_to cuenta factura belongs_to cliente

peeero, ambos modelos (cliente y factura) tiene un atributo obligatorio: account_id.

Cuando estoy tratando de crear un nuevo cliente sobre la marcha me sale un error :client_id: - can't be blank

La razón por la que estoy recibiendo este error es debido a que un cliente no se puede crear porque es que requiere una account_id en el Modelo de cliente Si elimino esta línea validates :account_id, :presence => true en el modelo de Cliente, la factura se agrega pero el Cliente no tiene account_id.

tengo esto en clients_controller.rb en la acción create para establecer un valor por defecto @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 

Respuesta

4

verificación de estos escribir-ups en la interfaz de consulta ActiveRecord de Rails 3. x:

http://guides.rubyonrails.org/active_record_querying.html (véase la sección "15 Dynamic Finders")

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

Primero deberá crear la cuenta, luego el cliente y luego la factura; de lo contrario, fallarán sus validaciones.

Es mejor para crear el cliente y la factura a través de sus padres, por ejemplo .:

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 

me gustaría recomendar a jugar con esto en su base de datos de desarrollo utilizando la consola rieles, que pueda obtener una idea de ella.

+0

La cuenta ya está creada. El usuario que inició sesión ya tiene un account_id y se puede acceder de esta manera 'current_user.account_id'. El problema es obtener ese mismo account_id en el nuevo registro del cliente. Voy a jugar con tu código ahora mismo. – leonel

+2

Tengo esto en mi modelo de factura 'def organization_name = (name); self.organization = Organization.find_or_create_by_name (name); a menos que name.blank ?; end' No se puede acceder al usuario_actual en un modelo. – leonel

+0

si crea el nuevo registro del cliente a partir del registro de la cuenta, heredará su account_id ... ver más arriba. – Tilo