Rails - 从连接表调用列的问题

时间:2009-09-23 02:37:29

标签: ruby-on-rails activerecord views

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

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

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

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 %>    

显示:#<Category:0x3f40634>
日志显示:
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
日志显示:应用程序不执行类别加载。

<%=h user.user_categories %>  

显示:#<UserCategory:0x3e4d1a0>
日志显示: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)  %>  

产生与上述相同的结果。

基于此,我认为&lt;%= h user.categories%&gt;是最有意义的那个,但我已经尝试了我能想到的每一个变体,它们都会抛出异常。

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

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

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