我有一个用户索引,其中显示用户名,用户位置和一个名为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;是最有意义的那个,但我已经尝试了我能想到的每一个变体,它们都会抛出异常。
答案 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 - 在这种情况下,他们会迭代帖子的评论。