0

您好,我创建了 2 个表(类别和员工),两者都存在关系,我想在我的员工索引视图中显示类别名称(类别表)而不是 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 中,我想显示来自我的类​​别表的类别名称

<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

4 回答 4

0
<%= h e.category.category_name %>

会成功的。

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

所以在你的控制器中,你必须改变

@employees = Employee.all

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

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

(顺便说一句,你现在真的应该转向 Rails 3。Rails 4 是最新的。每个版本都提供了比上一个更多的功能。)

于 2013-08-22T08:14:33.413 回答
0

在您的员工索引视图中,

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

instead of

<td><%=h e.categories_id %>
于 2013-08-22T08:20:45.513 回答
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 %>
于 2013-08-25T15:24:51.593 回答
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 号,在 Category 模型中使用 .name 方法找到它。所以我想你的解决方案应该是这样的:

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

我希望这会使某人受益。

于 2017-04-14T10:50:42.370 回答