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=
?
Non, il ne recherche pas company_id, par exemple changez votre code comme suit
class Car < ActiveRecord::Base
belongs_to :vendor
belongs_to :company, :class_name => :Vendor,:foreign_key => "vendor_id"
end
Nous pouvons utiliser un attribut d'alias.
alias_attribute :company, :vendor
Dans Rails 4, vous devriez simplement pouvoir ajouter alias_attribute :company, :vendor
à votre modèle.
Version courte:
Générer un modèle avec migration
$ Rails generate model Car vendor:references name:string ...
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
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
.
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
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
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
@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.
class Car < ActiveRecord::Base
belongs_to :vendor
belongs_to :company, :class_name => :Vendor
end