获取Rails记录计数而不是第二次查询

baa*_*h05 4 activerecord ruby-on-rails

我有一个Rails ActiveRecord查询,它查找名称是某些标记的所有记录.

records = Market.where("lower(name) = ?", name.downcase );
rec = records.first;
count = records.count;
Run Code Online (Sandbox Code Playgroud)

服务器显示调用.first.count同时访问数据库.

?[1m?[35mCACHE (0.0ms)?[0m  SELECT "markets".* FROM "markets" WHERE (lower(nam
e) = 'my market') LIMIT 1

?[1m?[36mCACHE (0.0ms)?[0m  ?[1mSELECT COUNT(*) FROM "markets" WHERE (lower(na
me) = 'my market')?[0m
Run Code Online (Sandbox Code Playgroud)

当它可以使用已经查询的结果时,为什么要进入数据库来获取计数?

我担心未来的表现.今天有1000条记录.当该表包含800万行时,对数据执行两次查询,对数据执行一次查询,这将是昂贵的.

如何从集合中获取计数,而不是数据库?

Hoo*_*opo 9

RactiveRecord使用延迟查询从数据库中获取数据.如果要简单计算记录,则只能调用retrun数组的大小.

records = Market.where("lower(name) = ?", name.downcase ).all
records.size
Run Code Online (Sandbox Code Playgroud)


kaf*_*hau 8

所以,records是一个ActiveRelation.您会认为这是符合您where标准的所有市场记录的数组,但事实并非如此.每次您引用类似firstcount关系的内容时,它都会执行查询检索您要求的内容.

要将实际记录放入数组中,只需添加.all到实际检索它们的关系即可.喜欢:

records = Market.where("lower(name) = ?", name.downcase).all
count = records.count
Run Code Online (Sandbox Code Playgroud)