我有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)
但是将消息绑定到用户的列表证明是难以捉摸的。我做错了什么或我该怎么做?帮助赞赏。
答案 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)