我希望当前用户阅读并购买他所在俱乐部的帖子。我很想做下面这样的事情,但我读过或尝试过的东西都没有点击。我将使用许多这种类型的嵌套集合,我被卡住了
型号
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|
给我一个错误:
的未定义方法"membership"nil:NilClass
对此我并不感到惊讶。此外,我希望能够只选择将只在某个事件中发布的帖子,等等。
模式总结:俱乐部有很多活动&用户。用户有许多产品,他们可以在不同的活动日期发布数量以进行销售。只有俱乐部会员才能在俱乐部发帖或查看帖子。
我没有在模型中重复数据,而是建立了关联,这似乎使在ActiveRecord中创建集合时无法访问数据。我在我的研究中发现了关联加入模型,以及带有metawhere的智能关联映射。这些链接让我感觉自己快要接近了。
编辑
我已经登录,只要不尝试进行这样的收集,就可以访问我需要的所有数据。例如,我可以通过检查我是否是俱乐部的成员
def member?(club)
return !!self.clubs.find(club)
我是一个笨蛋,所以我一定错过了一些显而易见的东西。我需要把我的收藏分成几步吗?即收集用户俱乐部、收集用户俱乐部产品、收集用户协会产品帖子。。。感谢
记录器信息
@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
当我删除注释时,我再次得到零错误,现在是"product"(进度!)。我肯定以为我以前登录过。。虽然很晚
该错误消息表示current_user
是nil
。你确定你的身份验证系统正常工作吗?
这是我找到的解决方案,使用的是Rails 3.1 中的标准gem-nested_has_many_through
用户模型
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} %>
这通过使用最小代码的关系返回深度嵌套数据。我当然希望它有效率,但至少我的理智没有受到影响!