проблема порядка запроса SQL - PullRequest
1 голос
/ 17 апреля 2011

Итак, у меня есть следующая модель в activerecord, я буду использовать Discussion.user_replied_group_discussions(@user), она хорошо возвращает недавние ответы, но как мне изменить приватный метод, чтобы упорядочить возвращенные обсуждения по самому последнему времени ответа?

# Table name: discussions
#
#  id               :integer         not null, primary key
#  title            :string(255)     not null
#  content          :text(255)       not null
#  created_at       :datetime
#  updated_at       :datetime
#  user_id          :integer
#  discussable_id   :integer
#  discussable_type :string(255)
class Discussion < ActiveRecord::Base
  has_many    :comments, :as => :commentable, :dependent => :destroy
  #
  #this is the scope that I am having trouble with:
  #
  scope :user_replied_group_discussions, lambda {|user| replied_by(user) }

  private
    def self.replied_by(user)
      discussion_ids = %(SELECT commentable_id FROM comments 
                     WHERE commentable_type = 'Discussion' AND user_id = :user_id)
      where("discussable_type = 'Group' AND id IN (#{discussion_ids}) ", 
           { :user_id => user })
    end
end

# Table name: comments
#
#  id               :integer         not null, primary key
#  content          :text
#  created_at       :datetime
#  updated_at       :datetime
#  commentable_id   :integer
#  commentable_type :string(255)
#  user_id          :integer
#

class Comment < ActiveRecord::Base

  belongs_to :commentable, :polymorphic => true
  belongs_to :user

end

UPDATE: Помог SQL-запрос, предоставленный @ypercube, теперь я использую его с find_by_sql. Но, кажется, неудобно помещать это в контроллер.

Есть ли лучшее решение? Спасибо!

1 Ответ

1 голос
/ 17 апреля 2011

Это будет порядок в соответствии с последним discussions.updated_at временем:

where("discussable_type = 'Group' AND id IN (#{discussion_ids}) 
order by updated_at DESC ",

Если вы хотите заказать по comment.created_at, используйте этот запрос:

SELECT d.*
     , MAX(c.created_at) AS lastCommentTime
FROM discussions d
  JOIN comments c
    ON d.id = c.commentable_id
WHERE c.commentable_type = 'Discussion'
  AND c.user_id = userIDtoCheck
GROUP BY d.id
ORDER BY lastCommentTime DESC        <--- latest first
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...