ruby on rails - que - ¿Es posible alias una asociación belongs_to en Rails?
ruby server (4)
Tengo un modelo con una asociación belongs_to :
class Car < ActiveRecord::Base
belongs_to :vendor
end
Entonces puedo llamar a car.vendor . ¡Pero también quiero llamar a car.company ! Entonces, tengo lo siguiente:
class Car < ActiveRecord::Base
belongs_to :vendor
def company
vendor
end
end
pero eso no resuelve la situación de asignación car.company = ''ford'' , así que necesito crear otro método para eso. ¿Hay un mecanismo simple de alias que pueda usar para asociaciones? ¿Puedo usar alias_method :company, :vendor y alias_method :company=, :vendor= ?
En Rails 4, simplemente debería poder agregar alias_attribute :company, :vendor a su modelo.
No, no busca a company_id, por ejemplo, cambie su código de la siguiente manera
En Rails3
class Car < ActiveRecord::Base
belongs_to :vendor
belongs_to :company, :class_name => :Vendor,:foreign_key => "vendor_id"
end
En Rails4
Podemos usar el atributo alias.
alias_attribute :company, :vendor
Version corta:
Generar modelo con migración
$ rails generate model Car vendor:references name:string ...Agregue la siguiente línea en
Carmodel iecar.rbfileclass Car < ActiveRecord::Base belongs_to :company, :class_name => ''Vendor'', :foreign_key => ''vendor_id'' endAhora tiene el método de instancia
@car.company.
Para obtener una explicación detallada, lea adelante [Opcional si entendió lo anterior!]
Versión detallada:
El modelo Car tendrá una asociación con el modelo Vendor (que es obvio). Entonces debería haber vendor_id en los cars mesa.
Para asegurarse de que el campo
vendor_idestá presente en la tabla decars, ejecute lo siguiente en la línea de comando. Esto generará la migración correcta. Elvendor:referencesson importantes. Puede tener cualquier cantidad de atributos después de eso.$ rails generate model Car vendor:references name:stringO bien, en la migración existente para
create_table :carssimplemente agrega la líneat.references :vendorclass CreateCars < ActiveRecord::Migration def change create_table :cars do |t| t.string :name ... t.references :vendor t.timestamps end end endLo último que debes hacer es editar el modelo
Car. Así que agrega este código a tu archivocar.rbclass Car < ActiveRecord::Base belongs_to :company, :class_name => ''Vendor'', :foreign_key => ''vendor_id'' end
Después de realizar el tercer paso, obtendrá los siguientes métodos de instancia para el modelo de Car proporcionado por Rails Associations.
@car.companyCuando haga
@car.companydevolverá un objeto#<Vendor ...>. Para encontrar ese objeto#<Vendor ...>irá a buscar la columnavendor_iden la tabla decarsporque ha mencionado:foreign_key => ''vendor_id''Puede configurar la empresa para una instancia de automóvil escribiendo
@car.company = @vendor || Vendor.find(params[:id]) #whichever Vendor object you want @car.saveEsto guardará la
idde ese objeto deVendoren el campovendor_idde la tabla decars.
Gracias.
class Car < ActiveRecord::Base
belongs_to :vendor
belongs_to :company, :class_name => :Vendor
end