2010-05-22 5 views
1

J'ai 3 tables pertinentes. User, Orders et ViewablesRails - Logique pour trouver des informations d'un: has_many: par nécessaire!

L'idée est que chaque utilisateur a reçu de nombreuses commandes, mais en même temps, chaque utilisateur peut voir d'autres commandes spécifiques appartenant à d'autres utilisateurs. So Viewables a les attributs user_id et order_id.

commandes a un :has_many :Users, :through => :viewables

Est-il possible de faire une trouvaille dans la vue d'une commande? donc quelque chose comme

@viewable_orders = Orders.find (: all,: conditions => [ "? Viewable.user_id =", 1])

Pour obtenir une liste des commandes qui sont visibles par user_id = 1. (Cela ne fonctionne pas, sinon je ne vais pas demander. :() L'idée étant que je peux faire quelque chose comme une barre latérale où l'utilisateur actuel (le connecté) peut afficher une liste des commandes d'autres personnes qui il peut voir Par exemple

Trois autres utilisateurs qui ont des ordres qu'il peut voir devraient être éventuellement affichés comme ceci:.

  1. Jack (2)
    • commande de base (registry_id: 1)
    • Nouvelle commande (registry_id: 29)
  2. Amy (4)
    • Short Order (registry_id: 12)
  3. Jill (5)
    • commande de matériel (14)
    • Commande Rose (17)
    • Commande de logiciels (76)

(Le nombre entre parenthèses sont les user_id respectifs ou registry_id)

Donc, pour trouver la liste de tous les ordres que l'utilisateur actuel peut trouver (en supposant user_id de l'utilisateur actuel est 1), serait être trouvé en faisant

@viewable_orders = Viewable.find(:all, :conditions => ["user_id=?", 1]) 

Et cela me donnerait la collection des 6 registres ci-dessus. Maintenant, la meilleure façon de ce faire, est pour moi d'avoir juste une liste de

+ Jill's Hardware Order 
+ Jill's Pink Order 
+ Amy's Short Order 
+ etc 

Mais cela devient laid pour les listes longues.

Merci!

Répondre

1

Vous devez configurer has_many: par association non seulement sur le modèle des ordres, mais aussi sur les utilisateurs.Comme vous l'avez déjà has_many :orders association pour l'utilisateur, vous pouvez donner à votre association un autre nom, par exemple, viewable_orders:

class User < ActiveRecord::Base 
    has_many :orders 
    has_many :viewables 
    has_many :viewable_orders, :through => :viewables, :source => :order 
end 

class Viewable < ActiveRecord::Base 
    belongs_to :user 
    belongs_to :order 
end 

class Order < ActiveRecord::Base 
    belongs_to :user 
    has_many :viewables 
    has_many :users, :through => :viewables 
end 

Et puis utilisez peut utiliser user.viewable_orders pour obtenir toutes les commandes utilisateur spécifique peut voir

+0

Cela a fonctionné! : D Je n'avais pas réalisé comment l'argument ': source' était utilisé jusqu'à ce que vous l'expliquiez. Merci tas! :RÉ –