在rails应用程序中放置“智能请求”代码的地方做数据库?

时间:2012-03-28 07:18:24

标签: ruby-on-rails model-view-controller

我有这样的事情:

在我看来:

<%= render :partial => 'show', :locals => { :employee => flash[:selection][:employee] } %>

在我的部分'节目'中:

<p>
  <b>Manager:</b>
  <%= Employee.find(employee.employee_id).first_name %> <%= Employee.find(employee.employee_id).last_name %>
</p>

问题: 我觉得从模型中询问某些东西(例如:Employee.find(employee.employee_id).first_name)并不是一个好方法...而且在某个视图中也似乎......是不是? 我应该在哪里将“智能请求”的代码放到数据库中,然后我应该如何从部分调用它?

UPD1 我做了像你之前建议的事情...... 在我的控制器中渲染该视图(因此将呈现部分视图)之前,我找到了这个员工并将其放入flash [:selection] [:employee] ... 此员工有很多列,例如:first_name,last_name,...,最后是employee_id。后一个employee_id是当前员工的经理(flash [:selection] [:employee])。 我想在我的部分中显示所有员工的字段。所以我将flash [:selection] [:employee]像员工一样传递给partial,然后在那里显示所有的东西:employee.first_name,...最后我想显示这个employee.employee_id不像整数id,但实际找到在数据库通讯员工,并把它的名字和姓氏... 在渲染我的视图之前,我不仅可以设置@employee,还可以设置它的@manager,然后将这些值传递给我的部分... 但是......这似乎有点“太多了,只是为了在一个地方展示这个@经理的名字和姓氏...... 我对吗?或者这是rails中的常见用法,不是吗?

3 个答案:

答案 0 :(得分:1)

我会把它放在呈现该视图的控制器中。在控制器操作中初始化一个实例变量,这可以从您的视图和部分中访问。像这样:

@employee = Employee.find(...)

在最新版本的Rails中,将该实例变量传递给部分变量非常简单:

<%= render 'show', :employee => @employee %>

然后在你的部分中,你会这样做:

<p>
  <b>Manager:</b>
  <%= employee.first_name %> <%= employee.last_name %>
</p>

答案 1 :(得分:0)

你是对的。您不应该在视图中使用查找程序。初始化视图需要在控制器中使用的变量。

http://guides.rubyonrails.org/action_controller_overview.html

答案 2 :(得分:0)

感谢所有人,我解决了这个问题,提供了以下关联:

class Employee < ActiveRecord::Base
  #...

  belongs_to :manager, :class_name => "Employee", :foreign_key => "employee_id"
end

然后从partial发出相应的电话:

employee.manager.first_name