web-dev-qa-db-fra.com

Possible d'alias une association d'appartenance à Rails?

J'ai un modèle avec un belongs_to association:

class Car < ActiveRecord::Base
  belongs_to :vendor
end

Je peux donc appeler car.vendor. Mais je veux aussi appeler car.company! Donc, j'ai ce qui suit:

class Car < ActiveRecord::Base
  belongs_to :vendor
  def company
    vendor
  end
end

mais cela ne résout pas la situation d'affectation car.company = 'ford', je dois donc créer une autre méthode pour cela. Existe-t-il un mécanisme alias simple que je peux utiliser pour les associations? Puis-je simplement utiliser alias_method :company, :vendor et alias_method :company=, :vendor=?

45
at.

Non, il ne recherche pas company_id, par exemple changez votre code comme suit

Dans Rails3

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

Dans Rails4

Nous pouvons utiliser un attribut d'alias.

alias_attribute :company, :vendor
65
pramod

Dans Rails 4, vous devriez simplement pouvoir ajouter alias_attribute :company, :vendor à votre modèle.

29
Fran Worley

Version courte:

  1. Générer un modèle avec migration

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

  2. Ajoutez la ligne suivante dans le modèle Car, c'est-à-dire car.rb fichier

    class Car < ActiveRecord::Base
      belongs_to :company, :class_name => 'Vendor', :foreign_key => 'vendor_id'
    end
    
  3. Maintenant vous avez @car.company méthode d'instance.

Pour une explication détaillée, lisez à l'avance [Facultatif si vous avez compris ce qui précède !!]

Version détaillée:

Le modèle Car sera associé au modèle Vendor (ce qui est évident). Il devrait donc y avoir un vendor_id dans le tableau cars.

  1. Afin de vous assurer que le champ vendor_id est présent dans la table cars, exécutez ce qui suit sur la ligne de commande. Cela générera la bonne migration. Le vendor:references est important. Vous pouvez avoir n'importe quel nombre d'attributs après cela.

    $ Rails generate model Car vendor:references name:string

  2. Ou bien dans la migration existante pour create_table :cars il suffit d'ajouter la ligne 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. La dernière chose que vous devez faire est de modifier le modèle Car. Ajoutez donc ce code à votre car.rb fichier

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

Après avoir effectué la troisième étape, vous obtiendrez les méthodes d'instance suivantes pour le modèle Car fournies par Rails Associations

  1. @car.company

    • Quand vous faites @car.company il renverra un #<Vendor ...> objet. Pour trouver que #<Vendor ...> objet, il ira chercher le vendor_id colonne dans la table cars car vous avez mentionné :foreign_key => 'vendor_id'

    • Vous pouvez définir la société pour une instance de voiture en écrivant

      @car.company = @vendor || Vendor.find(params[:id]) #whichever Vendor object you want
      @car.save
      

      Cela enregistrera le id de cet objet Vendor dans le vendor_id champ de la table cars.

Je vous remercie.

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