显示名称而不是ids rails

时间:2013-08-22 08:03:35

标签: ruby-on-rails ruby-on-rails-2

您好我创建了2个表(类别和员工),两者都处于关系中,我想在员工索引视图中显示category_name(Categories表)而不是id

****Here is my Categories Table******

  class CreateCategories < ActiveRecord::Migration
     def self.up
       create_table :categories do |t|
         t.string :category_name
       end
     end

     def self.down
       drop_table :categories
     end
  end

****Here is my Enployees Table******

  class CreateEmployees < ActiveRecord::Migration
    def self.up
      create_table :employees do |t|
         t.string  :name
         t.string  :last_name
         t.integer :categories_id 
      end
    execute "ALTER TABLE employees ADD CONSTRAINT fk_employees_categories FOREIGN KEY (categories_id) REFERENCES categories (id)"
    end

    def self.down
      drop_table :employees
    end
  end


****Here is my Employee controller******

class EmployeeController < ApplicationController
   def index
     @employees = Employee.all
   end
end

****Here is my Category controller******

class CategoryController < ApplicationController
   def index
     @categories = Category.all
   end
end

****Here is my Category Model******

class Category < ActiveRecord::Base
    has_many :employees
end

****Here is my Employee Model******

class Employee < ActiveRecord::Base
    belongs_to :category
end


****Here is Employee view*******

<table>
<tr>
    <th>Employee</th>
    <th>Last Name</th>
    <th>Category</th>
</tr>
    <% @employees.each do |e| %>
<tr>
    <td><%=h e.name %></td>
    <td><%=h e.last_name %></td>
    <td><%=h e.categories_id %>
</td>

在e.categories_id中,我想显示来自我的类​​别表

的categories_name
<td>
    <%= link_to ("View" ,:controller=>"employee",:action=>"show", :id=>e.id )  %>
</td>
<td>
    <%= link_to ("Edit", :controller=>"employee",:action=>"edit",:id=>e.id  ) %>
</td>
<td>  
    <%= link_to ( "Delete",:controller=>"employee",:action=>"destroy", :id=>e.id ,:confirm=>"sure?"  %>
</td>
</tr>
   <% end %>
</table>

有人可以帮我解决这个问题吗?

4 个答案:

答案 0 :(得分:0)

<%= h e.category.category_name %>

会做到这一点。

请注意,如果您只是这样做,它将导致为您正在显示的每一行执行SQL查询(称为N + 1问题)。

所以在你的控制器中,你将不得不改变

@employees = Employee.all

@employees = Employee.find(:all, :include => [:category])

这会强制加载,并将查询数量减少到2。

(作为旁注,你现在应该已经转移到Rails 3了.Rails 4是最新的。每个版本提供的功能比上一个更多。)

答案 1 :(得分:0)

在您的员工索引视图中,

<td><%=employee.categories.category_name %>

instead of

<td><%=h e.categories_id %>

答案 2 :(得分:0)

在您的员工控制器中添加此项 这意味着让category_name出现在索引视图而不是ID。

@category= Category.all()
@category_list=[]
@category.each do |c|
@category_list << [c.category_name,c.id]
end

然后在索引视图中

<td><%=employee.categories.category_name %>

答案 3 :(得分:0)

我知道这是一个迟到的答案,但对于那些正在寻找答案的人来说,这就是我如何实现这一目标的,

我有一个表功能,它与功能表有一对多的关联。我使用railscast方法进行多个复选框选择,因此对于每个不动产它都具有某些功能。我想在索引视图中显示每行中每个不动产的功能。我在节目视图中,功能显示如下,

@realty.feature_ids

控制器中的@realty是

@realty = Realty.find(params[:id])

但是,在索引视图中,realty.feature_ids只显示数字而不是名称。

在这里解决这个问题是我在索引视图中所做的:

<% @realties.each do |realty| %>
  <td>
    <% realty.feature_ids.each do |feature| %>
       <%= Feature.find(feature).name %>
    <% end %>
  </td>
<% end %>

所以对于上面的问题,循环遍历每个循环的id,这将给你id号,用.name方法在Category模型中找到它。所以我想你的解决方案看起来像这样:

<% @employees.each do |employee| %>
  <td>
    <% employee.category_ids.each do |category| %>
       <%= Category.find(category).name %>
    <% end %>
  </td>
<% end %>

我希望这会使某些人受益。