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
Car
model iecar.rb
fileclass Car < ActiveRecord::Base belongs_to :company, :class_name => ''Vendor'', :foreign_key => ''vendor_id'' end
Ahora 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_id
está presente en la tabla decars
, ejecute lo siguiente en la línea de comando. Esto generará la migración correcta. Elvendor:references
son importantes. Puede tener cualquier cantidad de atributos después de eso.$ rails generate model Car vendor:references name:string
O bien, en la migración existente para
create_table :cars
simplemente agrega la líneat.references :vendor
class CreateCars < ActiveRecord::Migration def change create_table :cars do |t| t.string :name ... t.references :vendor t.timestamps end end end
Lo último que debes hacer es editar el modelo
Car
. Así que agrega este código a tu archivocar.rb
class 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.company
Cuando haga
@car.company
devolverá un objeto#<Vendor ...>
. Para encontrar ese objeto#<Vendor ...>
irá a buscar la columnavendor_id
en la tabla decars
porque 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.save
Esto guardará la
id
de ese objeto deVendor
en el campovendor_id
de la tabla decars
.
Gracias.
class Car < ActiveRecord::Base
belongs_to :vendor
belongs_to :company, :class_name => :Vendor
end