2011-06-06 5 views
3

Je souhaite que l'utilisateur actuel lise et achète des articles dans les clubs dont il est membre. J'aimerais faire quelque chose comme ce qui suit, mais rien que j'ai lu ou essayé n'a encore cliqué. Je vais utiliser de nombreuses collections de nidification de ce type, je suis coincé!

modèlesCollections utilisant has_many,: relations

class User < ActiveRecord::Base 
     has_many :memberships 
     has_many :clubs, :through => :memberships 
     has_many :products 

    class Membership < ActiveRecord::Base 
     belongs_to :user 
     belongs_to :club 

    class Club < ActiveRecord::Base 
     has_many :memberships 
     has_many :users, :through => :memberships 
     has_many :events 

    class Event < ActiveRecord::Base 
     belongs_to :club 

    class Product < ActiveRecord::Base 
     belongs_to :user 
     has_many :posts 

    class Post < ActiveRecord::Base 
     belongs_to :product 
     belongs_to :event 

Messages Contrôleur

def index 
    @user = current_user 
    @posts_in_my_clubs = @user.memberships.collect { |a| a.products.posts} 

messages/index.html.erb

@posts_in_my_clubs do |post| 

me donne l'erreur:

undefined method `memberships' for nil:NilClass

À qui je ne suis pas surpris. En outre, je veux être en mesure de sélectionner uniquement les messages qui seront seulement à un certain événement, etc

Un résumé des modèles: Clubs ont de nombreux événements & Utilisateurs. Les utilisateurs ont de nombreux produits auxquels ils peuvent poster une quantité à vendre à différentes dates de l'événement. Seuls les utilisateurs membres d'un club peuvent afficher ou afficher des posts dans un club. Au lieu de répéter les données dans les modèles, j'ai créé des associations qui semblent rendre les données inaccessibles à la création de collections dans ActiveRecord. J'ai trouvé dans ma recherche Association Join Models, et Intelligent association mapping avec metawhere. Ces liens me donnent l'impression de me rapprocher.

Modifier

Je suis connecté et peut accéder à toutes les données dont j'ai besoin aussi longtemps que je ne suis pas essayer de faire une collection comme ça. Par exemple, je peux vérifier si je suis membre du club par

def member?(club) 
    return !!self.clubs.find(club) 

Je suis un noob, donc je dois manquer ici quelque chose d'évident. Dois-je diviser ma collection en plusieurs étapes? à savoir recueillir des clubs d'utilisateurs, recueillir les produits des clubs d'utilisateurs, recueillir les messages produits clubs utilisateur ... grâce

Logger.INFO

@user = current_user 
    logger.info @user 
    logger.info 'super secret message' 
    # @club_posts = @user.memberships.collect {|a| a.product.posts} 

retours

#<User:0x5b202a0> 
super secret message 

Quand je supprimer le commentaire, je reçois la Encore une fois, pour 'produit' (progression!). Je pensais que j'étais connecté avant ... il était tard

+0

D'abord résoudre le problème avec l'erreur "NilClass", parce que vous n'avez évidemment pas Utilisateur retourné par 'current_user'. Votre contrôleur authentifie-t-il correctement l'utilisateur dans before_fitler? Si vous avez besoin d'un utilisateur, vérifiez-vous si vous avez un utilisateur authentifié dans cette action? – MBO

+0

Lisez à nouveau mon commentaire - votre variable '@ user' contient zéro. Il n'y a pas de problème avec vos collections. C'est un problème avec votre code d'authentification. Mettez 'logger.info @ user' dans l'index après avoir assigné' @user = current_user'. S'il sort 'nil', alors vous n'avez pas d'enregistrement utilisateur dans la variable' @ user', donc ce n'est pas encore un problème avec les collections et les relations. – MBO

+0

Merci, la journalisation aidera à déboguer. – thejonster

Répondre

0

Voici la solution que j'ai trouvée, utilisant gem nested_has_many_through, qui est standard dans Rails 3.1

modèle utilisateur

has_many :products, :dependent => :destroy 
    has_many :orders, :dependent => :destroy 
    has_many :product_posts, :through => :products, :source => :posts, :uniq => true 
    has_many :food_orders, :through => :product_posts, :source => :orders, :uniq => true 

de CommandesController

@orders_for_my_products = current_user.food_orders.all 

index des commandes

<%= render :partial => "order", :collection => @for_my_products, :locals => {:order => @order} %> 

Cela renvoie les données imbriquées profondes via des relations en utilisant un minimum de code. J'espère que c'est efficace, mais au moins ma santé mentale est épargnée!

0

Ce message d'erreur signifie que current_user est nil. Êtes-vous sûr que votre système d'authentification fonctionne?

+0

Je suis connecté et peux accéder à toutes les données dont j'ai besoin tant que je suis ne cherche pas à faire une collection comme celle-ci. Par exemple, je peux vérifier si je suis un membre du club par def membre? (Club) retour !! self.clubs.find (club) – thejonster

Questions connexes