我希望当前用户在他所属的俱乐部中阅读和购买帖子。
我很乐意做类似以下的事情,但我已阅读或尝试的任何内容都没有点击过。我将使用这种类型的许多嵌套集合,我被卡住了!
的模型
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 Models和Intelligent 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'(进度!)。我确定以前我已经登录了......因为它已经晚了
答案 0 :(得分:0)
该错误消息表示current_user
为nil
。您确定您的身份验证系统正在运行吗?
答案 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
@orders_for_my_products = current_user.food_orders.all
<%= render :partial => "order", :collection => @for_my_products, :locals => {:order => @order} %>
这将使用最少的代码通过关系返回深层嵌套数据。我当然希望它有效率,但至少我的理智是幸免的!