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万行时,对数据执行两次查询,对数据执行一次查询,这将是昂贵的.
如何从集合中获取计数,而不是数据库?
RactiveRecord使用延迟查询从数据库中获取数据.如果要简单计算记录,则只能调用retrun数组的大小.
records = Market.where("lower(name) = ?", name.downcase ).all
records.size
Run Code Online (Sandbox Code Playgroud)
所以,records是一个ActiveRelation.您会认为这是符合您where标准的所有市场记录的数组,但事实并非如此.每次您引用类似first或count关系的内容时,它都会执行查询检索您要求的内容.
要将实际记录放入数组中,只需添加.all到实际检索它们的关系即可.喜欢:
records = Market.where("lower(name) = ?", name.downcase).all
count = records.count
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5077 次 |
| 最近记录: |