ActiveRecord关联:通过多个表获取数据

时间:2013-10-15 21:49:43

标签: ruby-on-rails database activerecord ruby-on-rails-4

我的Active Record Associations存在问题,并且想知道是否有人可以指出我正确的方向。我会尽力解释我的问题,但我甚至不确定该怎么称呼它。

我的数据库中有三个表都是互连的,我需要在一个视图文件中调用三个表中的每个表的信息。

主题中可以有多个帖子,每个帖子(和主题)都附有一个用户。我需要能够使用Post和Topics调用User表中的数据。

问题:如何通过多个模型从表中获取数据。 (主题 - >帖子 - >用户)

模特

class Topic < ActiveRecord::Base
    belongs_to :forum
    has_many :posts, :dependent => :destroy  
    belongs_to :user
end

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

class User < ActiveRecord::Base
    has_many :topics
    has_many :posts, through: => :topics
end

在View / Topics / show.html中,我正在尝试向发布的用户显示。当我试图获取信息时,它给出了“名称”未定义方法的错误。我想要的是:

http://i44.tinypic.com/1z4kapj.png

示例:帖子1由UserName

创建

查看/主题/ Show.html.erb

<% @topic.posts.each do |post| %>
    <tr>
        <td class="subforum" width="80%">
            <%= post.created_at %>
            <div class="go-right">
                <%= link_to 'Edit', edit_post_path(@post) %> 
            </div>
        </td>
    </tr>

    <tr>
        <td class="row1">
            <%= post.users.name %>
            <%= post.user_id %>
        </td>
    </tr>
    <tr>
        <td class="row1">
            <%= post.content %>
        </td>
    </tr>
<% end %>

1 个答案:

答案 0 :(得分:2)

你正确地做了,除了你应该调用post.user而不是post.users

Post模型中,您有一行belongs_to :user。这意味着Post模型只有一个User对象。这意味着,您可以通过关联名称的单数形式访问依赖对象,在本例中只是.user。如果你使用带有这种关系的复数形式,你会得到一个无用的(在这种情况下)收集代理,正如你所见,它与你的对象的行为不同。

如果您有类似has_many :users的内容,那么您确实会使用复数.users,并且您将获得User个对象的集合,与{{1}相同为您提供了一个集合Topics.posts对象。

同时

在这一行:Post,抛弃link_to 'Edit', edit_post_path(@post)符号,它应该是@。请记住,此符号引用的是一个实例变量,它与同名的局部范围变量(换句话说@post!= post)完全不同。

希望有所帮助。