2011-06-06 31 views
3

我希望當前用戶閱讀和購買他所在俱樂部中的帖子。 我很想做類似以下的事情,但是我讀過或嘗試過的東西沒有點擊過。我將使用這種類型的很多嵌套集合,我卡住了!

模式使用has_many進行收藏集::通過關係

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} 

帖子/ index.html.erb

@posts_in_my_clubs do |post| 

給我的錯誤:

undefined method `memberships' for nil:NilClass

對此我並不感到驚訝。此外,我希望能夠僅選擇僅在特定事件中發佈的帖子等。

模型摘要:俱樂部有很多活動&用戶。用戶有許多產品,他們可以在不同的活動日期發佈數量。只有屬於俱樂部會員的用戶纔可以在俱樂部發帖或查看帖子。

我沒有在模型中重複數據,而是創建了關聯,這似乎使數據無法在ActiveRecord中創建集合。我在我的研究Association Join ModelsIntelligent association mapping中發現了metawhere。這些鏈接讓我覺得我越來越接近。

編輯

我在簽署,只要能訪問所有我需要的數據,因爲我沒有試圖做這樣的集合。例如我可以通過檢查我是否是俱樂部的會員

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

我是一個noob,所以我必須在這裏丟失一些明顯的東西。我需要將我的收藏分成幾個步驟嗎?即收集用戶俱樂部,收集用戶俱樂部產品,收集用戶俱樂部產品帖子...感謝

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 

當我刪除了評論,我得到的零再次錯誤,'產品'現在(進展!)。我當然以爲我之前登錄..這是晚了

+0

首先解決「NilClass」錯誤的問題,因爲您明顯沒有'current_user'返回的用戶。您的控制器是否在before_fitler中正確認證用戶?如果您需要用戶,您是否在此操作中檢查是否已驗證用戶身份? – MBO 2011-06-06 08:34:13

+0

再次閱讀我的評論 - 你的'@ user'變量保持爲零。你的收藏沒有問題。這是您的驗證碼的問題。在分配'@user = current_user'後,將'logger.info @ user'放入索引中。如果它輸出'nil',那麼'@ user'變量中沒有用戶記錄,所以它對集合和關係沒有任何問題。 – MBO 2011-06-06 18:43:16

+0

謝謝,日誌記錄會幫助調試。 – thejonster 2011-06-07 03:09:18

回答

0

這是我找到的解決方案,使用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

該錯誤消息意味着current_usernil。你確定你的驗證系統正在工作嗎?

+0

我登錄並可以訪問所有我需要的數據,只要我不要試圖做這樣的集合。例如,我可以通過def成員來檢查我是否是俱樂部的成員?(俱樂部) return !! self.clubs.find(club) – thejonster 2011-06-06 17:50:10