Направляющие has_many дочерние строки количества ассоциации

Я бы предложил использовать [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 должен предотвратить это. Но если этого не произойдет, то поздравляю, вы нашли основной случай рельсов.

27
задан aceofbassgreg 2 October 2016 в 21:15
поделиться

2 ответа

Этот вызов 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 |
+----+----------------+------------+
28
ответ дан 28 November 2019 в 05:14
поделиться

С точки зрения SQL это выглядит тривиально - просто напишите новый запрос.

С точки зрения Rails указанные вами значения являются вычисленными значениями. Поэтому, если вы используете find_by_sql , класс Model не будет знать о вычисляемых полях и, следовательно, будет возвращать вычисленные значения в виде строк, даже если вам удастся перевести запрос в язык Rails. См. Связанный вопрос ниже.
Общий дрейф (из ответов, которые я получил на этот вопрос) заключался в том, чтобы отдельный класс отвечал за сведение / вычисление нужных значений.

Как заставить рельсы возвращать атрибуты SUM (columnName) с правильным типом данных вместо string?

4
ответ дан 28 November 2019 в 05:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: