这甚至应该是一个很好的:通过联想?

时间:2010-03-30 19:01:59

标签: ruby-on-rails database-design relational-database has-many-through

帖子属于用户,用户有多个帖子 帖子也属于主题,主题有很多帖子。

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。但是,这些属性存储在用户模型中,而不是与主题相关联。那我该如何设置呢?

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

或许,这可能是通过联想的某种“单向”方式。就像Post会是连接模型一样,主题就是has_many:users,:through =&gt; :帖子。但事实恰恰相反。就像用户没有has_many:topics。

所以这甚至需要是has_many:虽然关联?我想我只是对控制器看起来像调用Post的帖子和用户的主题有点困惑。

编辑:说真的,谢谢所有权衡的人。我选择了tal的答案,因为我将他的代码用于我的控制器;但是,我可以轻松地选择j。或者tim。谢谢你们两位。这实现起来非常简单。我想今天可能标志着我对铁轨的热爱。

3 个答案:

答案 0 :(得分:3)

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

类似的东西:

@topic.posts.each do |post|
   user_name = post.user.name
   user_photo = post.user.photo
end
这很简单。对不起,如果我不太了解你的问题。

答案 1 :(得分:2)

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

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

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

在视图中(haml):

- @posts.each do |post|
  = post.user.name
  = post.body

答案 2 :(得分:2)

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

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

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