【问题标题】:Rails - Problem calling column from join tableRails - 从连接表调用列时出现问题
【发布时间】:2009-09-23 02:37:28
【问题描述】:

我有一个用户索引,其中显示用户名、用户位置和一个称为类别的字段,范围可以从零到多个项目。我无法正确显示类别。这是我的详细信息:

用户
has_many :user_categories
has_many :categories, :through => :user_categories

类别
has_many :user_categories
has_many :users, :through => :user_categories

用户类别
belongs_to :user
belongs_to :category

在我的 user_categories 表中,有三列:id、user_id、category_id。
在我的类别表中,有两列:id 和 name。

在我的用户/索引视图中,我有以下内容:

<% @users.each do |user| %>
  <%= link_to user.name, user %>  
  <%=h user.state %>
  <%=h user.categories %> ## This line is the problem
<% end %>  

我在上面直接用我的评论指出了问题,我尝试了多种变体,但不知何故我错过了它。以下是我尝试过的变体,以及它们产生的结果。请注意,对于测试,用户 #2 是唯一具有应显示类别的用户。

<%=h user.categories %>    

显示:#&lt;Category:0x3f40634&gt;
日志显示:
UserCategory Load (0.4ms) SELECT * FROM "user_categories" WHERE ("user_categories".user_id = 2)

Category Load (0.4ms) SELECT "categories".* FROM "categories" INNER JOIN "user_categories" ON "categories".id = "user_categories".category_id WHERE (("user_categories".user_id = 2))

<%=h user.categories.name %> <-- Here I added .name at the end of the call 

显示:category
日志显示:App 不做分类加载。

<%=h user.user_categories %>  

显示:#&lt;UserCategory:0x3e4d1a0&gt;
日志显示:UserCategory Load (0.4ms) SELECT * FROM "user_categories" WHERE ("user_categories"."user_id" = 2) AND ("user_categories".user_id = 2) LIMIT 1
不进行类别加载。

<%=h user.user_categories.find_by_user_id(user.id)  %>  

产生与上述相同的结果。

基于此,我认为 是最有意义的一个,但我尝试了所有我能想到的变体,它们都抛出异常。

【问题讨论】:

    标签: ruby-on-rails activerecord views


    【解决方案1】:

    模型定义看起来正确。您可能需要检查您的数据库以确保您使用了正确的 id 约定。我担心您试图在“问题行”中显示所有类别。尝试循环它们:

    <% @users.each do |user| %>
      <%= link_to user.name, user %>  
      <%=h user.state %>
      <%=user.categories.each do |c| %>
        <%h c.name%>
      <%end%>
    <% end %>
    

    【讨论】:

    • 那行得通。知道为什么我以前的方法不起作用吗?我不确定我是否理解问题所在。
    • 这个答案是正确的。 <0x3f40634>
    【解决方案2】:

    您遇到的问题是,在所有三种情况下,您都试图显示或操作 ActiveRecord 对象的集合。 &lt;%= h user.categories %&gt;&lt;%= h user.user_categories %&gt; 将显示在集合上调用 to_s 的结果,这会给出您记下的输出(#&lt;Category:0x3f40634&gt;#&lt;UserCategory:0x3e4d1a0&gt;)。 将显示在类别关联上调用name 的结果。

    jrhicks 的答案很有效,因为他遍历了类别并打印了每个类别的名称。有关类似示例,请参阅 http://guides.rubyonrails.org/getting_started.html#hooking-comments-to-posts - 在这种情况下,它们会遍历帖子的 cmets。

    【讨论】:

    • 谢谢。感谢您的跟进。
    猜你喜欢
    • 2013-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-21
    • 1970-01-01
    • 2016-10-22
    • 1970-01-01
    相关资源
    最近更新 更多