在has_many视图表中显示名称而不是ID

时间:2012-05-26 00:13:32

标签: ruby-on-rails ruby-on-rails-3

我已经尝试过其他几个类似的帖子,但我仍然收到错误。

在Posts模型中,我有一个category_id字段。我有以下型号:

#Posts model
belongs_to :categories  

#Category model
has_many :posts

在帖子索引控制器中我有:

@categories = @posts.Category.find(:all, :order => 'categoryname')

在我有的视图中:

<% @posts.each do |post| %>
<tr>
<td><%= post.category_id %></td>
<td><%= @categories.categoryname %></td>

<td><%= link_to 'View', post %></td>
<td><%= link_to 'Edit', edit_post_path(post) %></td>
</tr>
<% end %>

在第二列中,我尝试显示Category表中的类别名称(“categoryname”),而不是posts表中的category_id。我收到一个错误:

#ActiveRecord的未定义方法`类别'::关系:0x3e1a9b0&gt;

我也尝试过:

<td><%= post.categories.categoryname %></td>

但是得到同样的错误。

以及:

<td><%= post.category.categoryname %></td>

任何建议都将不胜感激。

5 个答案:

答案 0 :(得分:11)

在你的模特中

belongs_to :category

在你看来

<td><%= post.category.categoryname %></td>

您可以摆脱控制器中的@categories =

此外,categoryname可能不是Category模型的最佳属性名称。为什么不将它命名为namepost.category.name似乎比post.category.categoryname好很多,你不觉得吗?

答案 1 :(得分:4)

好的,有几件事

belongs_to :categories  

belongs_to是一种奇异的关系。你应该放

belongs_to :category 

在这种情况下,您需要在posts表中使用category_id。你可以通过

获得类别
@post.category.categoryname

除非帖子可以包含多个类别,否则您需要

#Post
has_and_belongs_to_many :categories

#Category
has_and_belongs_to_many :posts

在这种情况下,您需要一个名为categories_posts的联接表,其中包含两个字段category_idpost_id,您可以通过调用

来获取它
@post.categories.each do |cat|
  cat.categoryname
end

您的代码还存在其他一些问题,例如

@categories = @posts.Category.find(:all, :order => 'categoryname')

类别是模型,而不是您的命名关系,这可能是您在应用程序中获得异常的原因。

答案 2 :(得分:2)

您将收到以下错误

  
    

nil的未定义方法`categoryname':行上的NilClass:&lt;%= post.category.categoryname%&gt;

  

如果您的表中没有指定类别的记录。

换句话说,确保所有记录都有与之关联的类别

答案 3 :(得分:0)

我注意到控制器中的@category以小写字母c开头,但在您的视图中,它以大写字母开头!

答案 4 :(得分:0)

在您的情况下,如果您可以在帖子表(正如您在评论中提到的)中拥有空的category_id,则可以添加

 Queue<A> queue = new PriorityQueue<>(
                    4 //initialCapacity
                 , new Comparator<A>() {
                public int compare(A p1, A p2) {
                    return Integer.valueOf(p1.getPriority()).compareTo(p2.getPriority());
                }
            });

所以你的细胞看起来像这样:

if post.category_id?

如果post.category_id为null,则只显示一个空单元格。