Я бы предложил использовать [Timecop] [1] для такого рода испытаний. Я также добавил бы, что не рекомендуется вручную прикасаться к отметке времени, поэтому я даже не совсем уверен, что вы проверяете. Похоже, вы не доверяете меткам времени. Но если вы должны, здесь:
Timecop.freeze
tmp_time = Time.zone.now
u = User.find(1)
u.updated_at = tmp_time
u.save!
u.reload
#your tests should pass now
Если они этого не делают, [см. Этот открытый вопрос по основным рельсам] [2]. Если это связано с вашей проблемой, Timecop должен предотвратить это. Но если этого не произойдет, то поздравляю, вы нашли основной случай рельсов.
Этот вызов activerecord должен делать то, что вы хотите:
Article.find(:all, :select => 'articles.*, count(posts.id) as post_count',
:joins => 'left outer join posts on posts.article_id = articles.id',
:group => 'articles.id'
)
Это вернет список объектов статьи, каждый из которых имеет метод post_count
, который содержит номер сообщений в статье в виде строки.
Метод выполняет sql, как показано ниже:
SELECT articles.*, count(posts.id) AS post_count
FROM `articles`
LEFT OUTER JOIN posts ON posts.article_id = articles.id
GROUP BY articles.id
Если вам интересно, это пример результатов MySQL, которые вы можете увидеть при выполнении такого запроса:
+----+----------------+------------+
| id | text | post_count |
+----+----------------+------------+
| 1 | TEXT TEXT TEXT | 1 |
| 2 | TEXT TEXT TEXT | 3 |
| 3 | TEXT TEXT TEXT | 0 |
+----+----------------+------------+
С точки зрения SQL это выглядит тривиально - просто напишите новый запрос.
С точки зрения Rails указанные вами значения являются вычисленными значениями. Поэтому, если вы используете find_by_sql
, класс Model не будет знать о вычисляемых полях и, следовательно, будет возвращать вычисленные значения в виде строк, даже если вам удастся перевести запрос в язык Rails. См. Связанный вопрос ниже.
Общий дрейф (из ответов, которые я получил на этот вопрос) заключался в том, чтобы отдельный класс отвечал за сведение / вычисление нужных значений.
Как заставить рельсы возвращать атрибуты SUM (columnName) с правильным типом данных вместо string?