1

一个帖子属于一个用户,一个用户有_许多帖子。
一个帖子也属于一个主题,一个主题有_许多帖子。

class User < ActiveRecord::Base
  has_many :posts
end

class Topic < ActiveRecord::Base
  has_many :posts
end

class Post < ActiveRecord::Base
   belongs_to :user
   belongs_to :topic
end

嗯,这很简单,也很容易设置,但是当我显示一个主题时,我不仅想要该主题的所有帖子,还想要发布该帖子的用户的 user_name 和 user_photo。但是,这些属性存储在 User 模型中,并且与 Topic 无关。那么我该如何设置呢?

也许它已经可以调用了,因为 Post 模型有两个外键,一个用于用户,一个用于主题?

或者,也许这是某种通过关联的“单向”has_many。就像 Post 是 join 模型,Topic 是 has_many :users, :through => :posts。但这反过来是不正确的。就像用户没有 has_many :topics。

那么这甚至需要 has_many :though 关联吗?我想我只是对控制器将帖子和该帖子的用户都称为给定主题的外观有点困惑。

编辑:说真的,感谢所有参与的人。我选择 tal 的答案是因为我将他的代码用于我的控制器;但是,我可以很容易地选择 j.'s 或 tim's。也谢谢你们俩。这实现起来非常简单。我想今天可能标志着我对 Rails 的热爱的开始。

4

3 回答 3

3

您可以在显示主题及其帖子时获得user_nameand ......user_photo

就像是:

@topic.posts.each do |post|
   user_name = post.user.name
   user_photo = post.user.photo
end

这很简单。抱歉,如果我不能很好地理解您的问题。

于 2010-03-30T19:12:34.017 回答
2

好吧,如果您想要显示帖子作者的用户名,例如,您可以执行以下操作(未经测试,但应该可以):

@posts = topic.posts.all(:include => :user) 

它应该为所有帖子生成一个请求,为用户生成一个请求,并且帖子集合应该有用户。

在一个视图中(这里是haml):

- @posts.each do |post|
  = post.user.name
  = post.body
于 2010-03-30T19:13:59.847 回答
2

如果我正确理解您的问题,不,这里不需要 has_many :through 关联。

如果您想显示在​​某个主题中发布的所有用户的列表(跳过发布信息),那么它会很有帮助。

但是,您需要从帖子中急切加载用户,以防止 n+1 查询。

于 2010-03-30T19:15:26.163 回答