2010-12-18 5 views
1

Pourquoi la table des connexions est-elle mise à jour lorsque j'appelle @ user.connections pour les éléments suivants?ActiveRecord Array Array Array vs Concatenated Array

Connexion Modèle

class Connection < ActiveRecord::Base 
    belongs_to :left_nodeable, :polymorphic => true 
    belongs_to :right_nodeable, :polymorphic => true 

    # Statuses: 
    PENDING = 0  
    ACCEPTED = 1 

    named_scope :pending, :conditions => { :connection_status => PENDING } 
    named_scope :accepted, :conditions => { :connection_status => ACCEPTED } 
end 

Modèle utilisateur

class User < ActiveRecord::Base 
    has_many :left_connections, :as => :left_nodeable, :class_name => 'Connection', :conditions => {:left_nodeable_type => 'User', :right_nodeable_type => 'User'} 
    has_many :right_connections, :as => :right_nodeable, :class_name => 'Connection', :conditions => {:right_nodeable_type => 'User', :left_nodeable_type => 'User'} 

    def connections 
     self.left_connections << self.right_connections 
    end 
end 

Si j'utilise:

def connections 
     self.left_connections + self.right_connections 
    end 

Ensuite, le modèle fonctionne ok, mais je ne peux pas utiliser l'une de mes méthodes de named_scope.

donc je suppose que mes questions se résume à ...

Quelle est la différence entre le « < < » et l'opérateur « + » sur un ActiveRecord? Pourquoi l'utilisation de "< <" change-t-elle la base de données et l'utilisation de "+" provoque l'échec des méthodes named_scope?

Répondre

2

Le modèle est mis à jour parce que left_connections est mis à jour avec la méthode <<. Cela rend left_connections = left_connections + right_connections.

arr = [1,2] 
arr << [3,4] 
arr #=> [1,2,3,4] 
------------------------- 
arr = [1,2] 
arr + [3,4] #=> [1,2,3,4] 
arr #=> [1,2] 

self.left_connections + self.right_connections est la bonne façon de retourner une concaténation. En ce qui concerne vos méthodes named_scope, je ne pourrais pas vous dire pourquoi elles échouent sans les voir.

+0

Merci Garrett. J'ai mis à jour la question avec des étendues nommées qui échouent dans le modèle de connexion. Donc, la question restante serait "comment puis-je appeler @ user.connections.pending? – BenB

+0

Ah, donc le problème est .connections() retourne un tableau, et vous ne pouvez pas utiliser une portée sur un tableau. @ user.connections.reject {| c | c.connection_status == ACCEPTED} ' –

+0

ou vous pouvez créer une méthode/portée de classe de connexion' self.with_user (user_id) 'qui retourne' where ("user_id =?", user_id) 'et enchaînez-les (par exemple' Connection.with_user (@ user.id) .pending'). Désolé pour la syntaxe rails 3, mais cela fait longtemps que j'ai utilisé les requêtes rails 2 –