tutorial rails que ejemplos descargar curso ruby-on-rails ruby ruby-on-rails-3 ruby-on-rails-3.2 ruby-on-rails-4

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:

  1. Generar modelo con migración

    $ rails generate model Car vendor:references name:string ...

  2. Agregue la siguiente línea en Car model ie car.rb file

    class Car < ActiveRecord::Base belongs_to :company, :class_name => ''Vendor'', :foreign_key => ''vendor_id'' end

  3. 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.

  1. Para asegurarse de que el campo vendor_id está presente en la tabla de cars , ejecute lo siguiente en la línea de comando. Esto generará la migración correcta. El vendor:references son importantes. Puede tener cualquier cantidad de atributos después de eso.

    $ rails generate model Car vendor:references name:string

  2. O bien, en la migración existente para create_table :cars simplemente agrega la línea t.references :vendor

    class CreateCars < ActiveRecord::Migration def change create_table :cars do |t| t.string :name ... t.references :vendor t.timestamps end end end

  3. Lo último que debes hacer es editar el modelo Car . Así que agrega este código a tu archivo car.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.

  1. @car.company

    • Cuando haga @car.company devolverá un objeto #<Vendor ...> . Para encontrar ese objeto #<Vendor ...> irá a buscar la columna vendor_id en la tabla de cars 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 de Vendor en el campo vendor_id de la tabla de cars .

Gracias.


class Car < ActiveRecord::Base belongs_to :vendor belongs_to :company, :class_name => :Vendor end