rails每个迭代器迭代两次

时间:2014-07-04 13:36:05

标签: sql ruby-on-rails ruby

我正在尝试获取一些嵌套查询来获取一些对象。这是一些代码

stream_controller.rb

def show
  @rank = Rank.where(user_id: Application.where(stream_id: @stream.id))
end

show.html.erb

<% i = 1 %>
<% @rank.each do |f| %>
  <tr>
    <td><%= i %></td>
    <td><%= f.user_id %></td>
    <td><%= User.find(f.user_id.to_i).name %></td>
    <td><%= f.rank %></td>
  <tr><br>
  <% i += 1 %>
<% end %>

问题是输出是:

Sr  User id     Name    Rank
1   15  a16 2
2   7   a7 a71  4
3   8   a8 a81  6
4   13  a14 a41 8
5   1   a1  13
6   4   sm  14
7   15  a16 2
8   7   a7 a71  4
9   8   a8 a81  6
10  13  a14 a41 8
11  1   a1  13
12  4   sm  14

这是它的两次迭代为什么会发生这种情况?以及如何防止它?

3 个答案:

答案 0 :(得分:1)

我并不是100%确定你要做的是什么,但你的代码可以整理一下。这是一个更好的循环方式:因为@rank是一个集合变量,我已根据惯例将其重命名为@ranks

<% @ranks.each_with_index do |rank, i| %>
  <tr>
    <td><%= i + 1 %></td>
    <td><%= rank.user_id %></td>
    <td><%= rank.user.name %></td>
    <td><%= rank.rank %></td>
  <tr><br>
<% end %>

答案 1 :(得分:0)

试试这个:

@rank = Rank.where(user_id: Application.where(stream_id: @stream.id)).uniq

.uniq(在行尾)将删除查询返回的任何重复行。

答案 2 :(得分:0)

我写了一个sql语句,它解决了我的问题并放入模型文件并从控制器上调用它按钮点击它解决了我的问题

def self.generate_result(stream_id)
sql = "select distinct user_id, rank from ranks where
       user_id = any(
       select user_id from applications where stream_id =
       #{stream_id}
       and verified = true)
       order by rank asc"
ActiveRecord::Base.connection.execute(sql)