Как я могу получить FOUND_ROW () из объекта активной записи в рельсах? - PullRequest
4 голосов
/ 18 июня 2010

При запросе к базе данных:

@robots = Robot.all(:condition => [:a => 'b'], :limit => 50, :offset => 0)

Каков наилучший способ получить общее количество строк без :limit?

В сыром MySQL вы можете сделать что-то вродеthis:

SELECT SQL_CALC_FOUND_ROWS * FROM robots WHERE a=b LIMIT 0, 50
SELECT FOUND_ROWS();

Есть ли активный способ записи?

Ответы [ 6 ]

4 голосов
/ 21 июня 2010

Это работает для меня:

ps = Post.all(:limit => 10, :select => "SQL_CALC_FOUND_ROWS *")
Post.connection.execute("select found_rows()").fetch_hash
=> {"found_rows()"=>"2447"}

Это, вероятно, не будет работать для объединений или чего-либо сложного, но это работает для простого случая.

2 голосов
/ 22 июля 2010

Robot.count - это действительно то решение, которое вам нужно.

Читая один из приведенных выше комментариев, похоже, вы неправильно понимаете, как работает .count.Он возвращает счетчик всех строк в таблице, только если нет параметров.

, но если вы передаете те же условия, которые вы передаете всем / find, например:

Robot.count(:conditions => {:a => 'b'})

.count () вернет количество строк, соответствующих заданным условиям.Просто чтобы быть очевидным - вы можете даже сохранить условный хеш как переменную для передачи в оба - чтобы уменьшить дублирование, так:

conds = {:a => 'b'}
@robots = Robot.all(:conditions => conds, :limit => 50)
@num_robots = Robot.count(:conditions => conds)

При этом вы не можете сделать после-факт рассчитывать на набор результатов (как в вашем примере).то есть вы не можете просто выполнить запрос и спросить его, сколько строк было бы найдено.Вы на самом деле должны звонить .count нарочно.

1 голос
/ 12 июля 2010
search = Robot.all(:condition => ["a=b"], :offset => 0)
@robots = search[0..49]
@count = search.count

Это должно получить то, что вы хотите, получить все роботы для подсчета, а затем установить @robots на первые 50. Может быть немного дороже, если таблица роботов огромна.

Вы, конечно, можете сделать:

@count=Robot.all(:condition => ["a=b"], :offset => 0).count
@robots=Robot.all(:condition => ["a=b"], :limit => 50, :offset => 0)

но это будет попадать в базу данных дважды при каждом запросе (хотя у rails есть кеширование запросов).

Оба решения используют только активную запись, поэтому не зависят от базы данных.

Зачем вам нужно общее количество, возвращаемое запросом? если его разбивка на страницы, посмотрите в Will_paginate (Railscast) , который может быть расширен с помощью AJAX и т. д ...

0 голосов
/ 12 июля 2010

Я думаю Хакунин прав.

Вы не можете получить возврат строки по запросу, просто проверяя размер результирующего массива запроса.

@robots = Robot.find_by_sql("Your sql")
or 
@robots = Robot.find(:all , :conditions=>["your condiitons"] )

@robots.size or @robots.count
0 голосов
/ 20 июня 2010

Является ли @robots.size тем, что вы ищете?Или Robot.count?

В противном случае, пожалуйста, уточните.

0 голосов
/ 18 июня 2010

Попробуйте find_by_sql Может, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...