Коллекции, использующие has_many,: сквозные отношения - PullRequest
3 голосов
/ 06 июня 2011

Я хочу, чтобы текущий пользователь читал и покупал сообщения в клубах, членом которых он является.Я хотел бы сделать что-то вроде следующего, но ничего, что я прочитал или попробовал, еще не щелкнуло.Я буду использовать много вложенных коллекций этого типа, я застрял! Модели

    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

Контроллер сообщений

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

posts / index.html.erb

@posts_in_my_clubs do |post|

Дает мне ошибку:

неопределенный метод `memberships 'для nil: NilClass

, который меня не удивляет.Дополнительно я хочу иметь возможность выбирать только те сообщения, которые будут только на определенном мероприятии и т. Д.

Краткое изложение моделей: Клубы имеют много событий и пользователей.У пользователей есть много Продуктов, в которые они могут Размещать количество для продажи в разные Даты Событий.Только пользователи, которые являются членами клуба, могут публиковать или просматривать сообщения в клубе.

Вместо того, чтобы повторять данные в моделях, я сделал ассоциации, которые, кажется, делают данные недоступными для создания коллекций в ActiveRecord.Я нашел в своем исследовании Модели объединения ассоциаций и Интеллектуальное сопоставление ассоциации с мета-местоположением.Эти ссылки заставляют меня чувствовать, что я приближаюсь.

Редактировать

Я вошел в систему и могу получить доступ ко всем нужным мне данным, пока я не пытаюсь сделатьКоллекция, как это.Например, я могу проверить, являюсь ли я членом клуба, по

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

Я нуб, поэтому я должен упустить что-то очевидное здесь.Нужно ли разбивать мою коллекцию на шаги?т.е. собирать пользовательские клубы, собирать пользовательские продукты клубов, собирать сообщения о пользовательских клубных продуктах ... спасибо

Logger.info

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

возвращает

#<User:0x5b202a0>
super secret message

Когда я удаляюкомментарий, я снова получаю ноль ошибок, для «продукта» сейчас (прогресс!).Я уверен, что думал, что я вошел в систему раньше .. хотя было уже поздно

Ответы [ 2 ]

0 голосов
/ 20 июня 2011

Вот решение, которое я нашел, используя gem nested_has_many_through, стандартное в Rails 3.1

Модель пользователя

  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

OrdersController

 @orders_for_my_products = current_user.food_orders.all

Индекс заказов

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

Возвращает вложенные данные через отношения с использованием минимального кода.Я очень надеюсь, что это эффективно, но по крайней мере мое здравомыслие сохранено!

0 голосов
/ 06 июня 2011

Это сообщение об ошибке означает, что current_user равно nil.Вы уверены, что ваша система аутентификации работает?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...