如何从数据库中检索选择对象? Objetc冗余呈现

时间:2015-07-09 14:37:10

标签: ruby-on-rails database activerecord sqlite

我正在尝试检索数据库中的某些对象,但我无法弄清楚如何。 我尝试使用示波器但没有成功,但我认为这不是正确的解决方案。

以下是我主要涉及的文件(删除了不必要的行):

# app/controllers/operators_controller.rb
class OperatorsController < ApplicationController
  def index
    @operators = Operator.all.sort_by_newest
  end

具有以下范围:

# app/models/operator.rb
  scope :sort_by_newest, -> { order('created_at DESC') }

然后

# app/views/operators/index.html.erb
<ul class="operators">
  <%= render @operators %>
</ul>

这称为以下部分:

# app/views/operators/_operator.html.erb
<% @operators.where(local:true).find_each do |operator| %>
  <li><%= link_to operator.name, operator %></li>
<% end %>

运算符的值为Local(布尔值,默认为false),有3个元素local = true(然后36,其中local = false)。< / p>

2.2.0 :003 > Operator.all.count
   (0.2ms)  SELECT COUNT(*) FROM "operators"
 => 39
2.2.0 :004 > Operator.where(local: true).count
   (0.4ms)  SELECT COUNT(*) FROM "operators" WHERE "operators"."local" = 't'
 => 3
2.2.0 :005 > Operator.where(local: false).count
   (0.2ms)  SELECT COUNT(*) FROM "operators" WHERE "operators"."local" = 'f'
 => 36

问题是:它呈现3个local = true元素... 39次!

The 3 single objects I need are orange. Rendered 39 times.

我需要的3个单个物体是橙色的。渲染了39次。

如何使这项工作?

编辑:

我想在很多页面中有很多渲染(一个使用“local:true”元素,另一个使用“global:true”元素等等。)所以我想我不能直接修改为运算符:index方法?

3 个答案:

答案 0 :(得分:2)

你正在做重复的工作。尝试使用特定查询在控制器操作中搜索运算符:

def index
  @operators = Operator.where(local: true).sort_by_newest
end

然后只打印operator属性,而不在部分内部使用迭代器:

<li><%= link_to operator.name, operator %></li>

答案 1 :(得分:1)

当您致电<%= render @operators %>时,它会将_operator.html.erb部分呈现。但是,您不需要遍历@operators对象来呈现每个单独的@operators对象。假设您在each块中,只需编写代码:

<li><%= link_to operator.name, operator %></li>

答案 2 :(得分:0)

在编辑OP后我问过我自己的问题(如何在不触及操作符的情况下发出请求:index方法)

您可以在不触及运算符的情况下拥有数据库的多个视图:索引方法:

# app/model/operator.rb
def index
  @operators = Operator.all.sort_by_newest
end

接收请求的渲染(如前所述,实际上是迭代,所以不需要迭代到部分,否则你会有重复):

<%= render @operators #%>
<%= render @operators.where(local:true) %>
<%= render @operators.where(global:true) %>