【问题标题】:ActiveRecord Associations: Getting data through multiple tablesActiveRecord 关联:通过多个表获取数据
【发布时间】:2013-10-15 21:49:43
【问题描述】:

我的 Active Record 关联有问题,想知道是否有人可以为我指明正确的方向。我会尽力解释我的问题,但我什至不知道给它起什么名字。

我的数据库中有三个相互关联的表,我需要从一个视图文件中的三个表中的每一个中调用信息。

一个主题中可以有多个帖子,每个帖子(和主题)都附有一个用户。我需要能够使用 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 由用户名创建

查看/主题/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 %>

【问题讨论】:

  • 顺便说一句,你写了“控制器”,但那些是你发布的模型。我假设这只是一个错字。
  • 你说得对,谢谢。

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


【解决方案1】:

你做得对,只是你应该调用post.user,而不是post.users

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

如果你有类似has_many :users 的东西,那么你确实会使用复数形式的.users,你会得到一个User 对象的集合,就像Topics.posts 给你一个集合@987654332 @对象。

另外:

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

希望对您有所帮助。

【讨论】:

  • 我尝试了 post.user.name 并最终得到了同样的错误:nil:NilClass 的未定义方法“名称”我已经尝试了所有我能想到的让它工作的方法,它才不是。我觉得我在模型中遗漏了一些东西,这就是它不起作用的原因。
  • @lindsiria 啊哈,错误消息的最后一部分使一切变得不同。如果您熟悉 Java,这与空指针异常相同。这意味着您从该方法中没有得到任何回报,并试图在该“nil 对象”上调用一个方法。换句话说,那个特定的Post 对象没有关联的User 对象。
  • 我可以理解,但我该如何让 Post 对象具有关联的 User 对象?
  • @Lindsiria 此外,如果您的数据库中有 Post 对象和 nil user_id 列,假设这些是偶然创建的,您最好从数据库中完全删除这些列,这样您可以继续前进。一旦你得到Post 正确设置User,你就不应该有任何进一步的问题。
  • 你是对的。我知道 user_id 列中有空对象,但我没有意识到每个线程中的第一个帖子(当你创建线程时),它总是空的,这意味着会有一个错误......修复...我觉得自己像个白痴。大声笑谢谢你:)
猜你喜欢
  • 2020-03-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-03
  • 1970-01-01
  • 1970-01-01
  • 2013-02-24
相关资源
最近更新 更多