如何从2级嵌套模型访问记录

时间:2010-11-22 08:44:32

标签: ruby-on-rails model associations

我有3个模型User,Listing和Message。我想要的是经过身份验证的用户有很多列表。然后列表可以有多个消息。因此,消息通过列表模型与用户绑定。我能够获得用户列表但无法通过列表获取用户所拥有的消息。这是我目前拥有的协会。

class User < ActiveRecord::Base
    has_many :listings, :dependent => :destroy
end
class Listing < ActiveRecord::Base
   belongs_to :user
   has_many :messages
end
class Message < ActiveRecord::Base
   belongs_to :listing
end

要创建消息,我只需执行此操作;

@listing = Listing.find(params[:listing_id])
@message = @listing.messages.build(params[:message])

获得用户的列表我有这个;

@user_listings = Listing.user_listings(current_user)

但是将消息绑定到用户的列表证明是难以捉摸的。我做错了什么或我该怎么做?帮助赞赏。

4 个答案:

答案 0 :(得分:1)

仍然不确定user_listings的来源,但为什么不呢:

@user = User.find(params[:user_id], :include => {:listings => :messages})

@user.listings.each do |listing|
  listing.messages.each do |message|

#or 

@user.listings.collect(&:messages).each do |message|

#or (just read about using authenticated user so the same as above like this

current_user.listings(:all, :include => :messages)...

包括在一个查询中预取所有列表的关联消息,以便它们不会在循环中获取,从而导致n + 1查询。

----------

或另一种方法,如果您不需要列表数据。

#messages.rb

   def self.user_messages user_id
     find(:all, :joins => :listings, :conditions => ["listings.user_id = ?", user_id])

   #with pagination

   def self.user_messages user_id, page
     paginate(:all, :joins => :listings, 
                    :conditions => ["listings.user_id = ?", user_id],
                    :per_page => 10, :page => page)

答案 1 :(得分:0)

更新了您的评论。

您可能只想将has_many:消息添加到用户类,并向Message添加user_id列。然后你可以做current_user.messages

答案 2 :(得分:0)

这样的事情怎么样:

class User < ActiveRecord::Base
  has_many :listings, :dependent => :destroy
  has_many :listing_messages, :through => :listings

这样你就不必与用户“绑定”消息,因为它总是通过列表关联来访问:

current_user.listing_messages.all

或者我误解了你的问题?

答案 3 :(得分:0)

如果您已经拉出current_user。您只需拨打

即可直接访问商家信息

<强> current_user.listings

而不是

@user_listings = Listing.user_listings(current_user)