2013-05-13 1 views
0

Je me demandais quelle était la source (c'est-à-dire, la classe ou le module) des méthodes New et Create lors de l'utilisation d'associations dans Rails.Source des méthodes New et Create dans Rails ActiveRecord lors de l'utilisation des associations

Par exemple, la section Associations des guides Rails fournit ce cas:

class Customer < ActiveRecord::Base 
    has_many :orders, :dependent => :destroy 
end 

class Order < ActiveRecord::Base 
    belongs_to :customer 
end 

Et entre alors cette commande dans la console:

@order = @customer.orders.create(:order_date => Time.now) 

(Lien vers la section Rails Guides: http://guides.rubyonrails.org/association_basics.html) Quand je tape ceci:

Je reçois l'erreur:

undefined method `create' for class `Array' 
+0

Y at-il une méthode de création dans votre classe Order? –

+0

Cochez cette case: http://stackoverflow.com/a/10430216/1322562 – jdoe

Répondre

0

Vous devriez jeter un oeil à collection_proxy.rb ici - https://github.com/rails/rails/blob/master/activerecord/lib/active_record/associations/collection_proxy.rb
commencer à voir de ligne 204, il explique adéquatement comment Rails vient comme par magie avec des méthodes comme build et create dans les associations. Ils font partie du module Associations et de la classe CollectionProxy.

EDIT:
La plupart de ces méthodes dynamiques dans Rails arrivent, grâce à metaprogramming capacités en Ruby. @customer.orders est également un Associations, CollectionProxy est une classe incluse dans ce module et fournit donc ces méthodes d'instance.

@foo = @customer.orders 
@foo.included_modules 
#=> List of all `ActiveRecord` and `ActiveModel` modules, it includes. 
@foo.include? ActiveRecord::Associations 
#=> True 

Ainsi, @foo obtient l'honneur avec des méthodes comme build et create qui y sont présents, à la différence, juste un autre objet Array.

+0

Pouvez-vous donner un peu plus d'explications sur la façon dont la magie se produit? J'ai encore besoin de m'entraîner à lire le code source de Rails, de sorte que cette ressource ne soit pas aussi utile pour moi que pour les autres. Je suis toujours confus quant à la façon dont je peux faire un appel de new ou créer sur une instance de Array lorsque la classe Array ne semble pas avoir l'une de ces méthodes mélangées. – voltair

+0

Ajout d'infos ci-dessus. – kiddorails

Questions connexes