使用has_many,:通过关系的集合

时间:2011-06-06 08:23:17

标签: ruby-on-rails ruby-on-rails-3 collections

我希望当前用户在他所属的俱乐部中阅读和购买帖子。 我很乐意做类似以下的事情,但我已阅读或尝试的任何内容都没有点击过。我将使用这种类型的许多嵌套集合,我被卡住了!

模型

    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|

给我错误:

  

未定义的方法`成员资格'   零:NilClass

我并不感到惊讶。此外,我希望只能选择仅在特定事件中发布的帖子等。

模特概要:俱乐部有许多活动&amp;用户。用户拥有许多产品,他们可以在不同的活动日期发布数量。只有属于俱乐部会员的用户才能在俱乐部中发布或查看帖子。

我没有在模型中重复数据,而是建立了关联,这似乎使得数据无法在ActiveRecord中创建集合。我在我的研究Association Join ModelsIntelligent association mapping中找到了metawhere。这些链接让我觉得我已经接近了。

修改

我已登录并可以访问我需要的所有数据,只要我不想尝试这样的集合。例如,我可以通过

检查我是否是俱乐部的成员
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

当我删除评论时,我再次收到nil错误,现在为'product'(进度!)。我确定以前我已经登录了......因为它已经晚了

2 个答案:

答案 0 :(得分:0)

该错误消息表示current_usernil。您确定您的身份验证系统正在运行吗?

答案 1 :(得分: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}  %>

这将使用最少的代码通过关系返回深层嵌套数据。我当然希望它有效率,但至少我的理智是幸免的!