Rails .count和.each给出了不同数量的结果

时间:2014-03-08 18:37:40

标签: ruby-on-rails

我正在本地使用一个简单的rails应用程序来进行自己的学习。

在我看来,我有以下代码;

  Reviews (<%= @reviews.count %>)
  <% if @reviews.any? %>
      <% @reviews.each do |review| %>
          This is one review <br />
      <% end %>
  <% end %>

尽管看起来很简单,但输出结果如下;

  

评论(2)

     

这是一篇评论

     

这是一篇评论

     

这是一篇评论

这似乎与同一阵列上应该是一对非常简单的操作相矛盾。

作为参考,使用以下代码在控制器中构建数组;

class PlacesController < ApplicationController
  def show
    @place = Place.find(params[:id])
    @reviews = @place.reviews
    @title = @place.name
  end
end

可能是什么问题?

3 个答案:

答案 0 :(得分:2)

我会冒昧地回答:尝试将控制器内的代码更改为:

@reviews = @place.reviews.uniq

检查结果。

答案 1 :(得分:1)

似乎要解决它。知道为什么吗? - Matthew Higgins

SQL内部联接在这里取得了一席之地:) 它们会产生重复的实体。您可以通过修改控制器来确保:

 def show
   @place = Place.find(params[:id])
   sql_query = @place.reviews.to_sql
   render text: sql_query       
 end

你会在浏览器中看到sql查询。然后在数据库管理器中执行此查询,您将看到重复的结果集。

答案 2 :(得分:1)

我不喜欢回答我自己的问题,但我认为解释我发现的事情很重要,因为其他人最终会在同一个地方。

正如Vitalyp建议的那样,将@reviews = @place.reviews.uniq替换为@reviews = @place.reviews.uniq会产生正确的行数,但我正在努力解决原因,当打开表格时,显示只有两个记录。

事实证明,还有另一个模型,我之前尝试过使用它来创建多对多关联,这让人感到困惑。看来,由于我在决定不使用它之后没有完全删除它,当我完全销毁模型时,它的表格和任何引用它的东西都恢复正常。

似乎评论1与该地点相关联两次,一次是直接,一次是通过旧的多对多表,所以它出现了两次。

当我删除has_many:时,它没有多大意义,但我想这是Rails工作原理的一个特点。