Как вытащить пост с комментариями по определенной дате?

Есть страница с постом, есть комментарии, как сделать так, чтобы в одной переменной хранились посты и все комментарии к ним за определенную дату.
Пытаюсь сделать это таким образом, но ругается на второй where:
@posts = Post.where(user_id:123).joins(:comments).where(comments: {"created_at >= ? AND created_at < ?", "2016-06-23", "2016-06-24"})


Сама по себе эта часть работает:
Comments.where("created_at >= ? AND created_at < ?", "2016-06-23", "2016-06-24")
  • Вопрос задан
  • 231 просмотр
Решения вопроса 2
ibub1ik
@ibub1ik
Ruby/Rails Dev => Elixir
Следующий участок кода - вообще не валидный Ruby, где вы видели хэш без ключей?
{"created_at >= ? AND created_at < ?", "2016-06-23", "2016-06-24"}

То что вы пытаетесь сделать:
@posts = Post.where(user_id:123).includes(:comments).where(comments: { created_at: Time.zone.today...Time.zone.tomorrow })

Обратите внимание, что тут используется includes вместо joins, т.к. joins не осуществляет предзагрузку записей в память.
Ответ написан
anton9
@anton9
Люблю Ruby on Rails
Небольшая ремарка - я так предполагаю, что у вас этот код в контроллере. Такие вещи лучше выносить в модели используя scope и лямбды. В вашем случае это будет
class Post < ActiveRecord::Base

scope :recent, -> (start_date, end_date) { joins(:comments).where('comments.start_date =>?', 'comments.finish_date <=?', start_date, finish_date)}
# можно также добавить скоуп для поиска по юзер айди
scope :by_user, -> (user_id) {where (user_id: user_id)}

# теперь можно слинковать эти скоупы в отдельном методе
class << self
  def by_user_and_date(user, start, finish)
    by_user(user).recent(start, finish)
  end
end


В контроллере вызываем
@recent_by_user = Post.by_user_and_date(10, Date.today, Date.yesterday)
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@dmitryKovalskiy
программист средней руки
Я не специалист конечно по RoR, но попробую предположить. А вы знаете в какой скрипт разворачивается сия конструкция? И на что собственно ругается? и что в вашем понимании ругается? Лично я предполагаю что исполняется select с одним join, а в условии where используются столбцы без уточнения сущности фильтрации. В чистом SQL так делать конечно можно, но это немного лотерейно в связи с тем что обе таблицы могут иметь поле с названием created_at, а сервер как правило не горит желанием догадываться что именно вы хотите пофильтровать
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы