按模型关联排序的Active Record查询:Rails 3& SQLite的

时间:2011-08-23 16:02:06

标签: ruby-on-rails ruby-on-rails-3 activerecord

我使用Rails 3和SQLite,我正在尝试进行活动记录查询,并使用其他模型的信息同时对结果进行排序。我有一个资源模型(属于用户)和一个shared_items模型来处理用户彼此共享资源。我想创建一个用户创建的所有资源以及与之共享的资源。具有工作查询的资源模型:

class Resource < ActiveRecord::Base
  has_many :shared_items, :dependent => :destroy

  default_scope :order => 'resources.shared_items.created_at DESC'
  scope :from_users_sharing_with, lambda { |user| shared_with(user) }

  private

  def self.shared_with(user)

  resource_ids = %(SELECT resource_id FROM shared_items WHERE shared_with_id = :user_id)
  where("id IN (#{resource_ids}) OR user_id = :user_id",
        { :user_id => user })
end

此查询创建了一个由用户共享或创建的所有资源的良好“feed”数组,但它们是按资源创建日期排序的,而不是相应的shared_item的创建日期,这正是我要查找的内容做。如何在数据库级别编写排序?我以为我可以在Ruby中进行排序(就像Ian建议here)但是因为我想在分页中一次获取25个记录,我不认为我可以选择。 任何想法都赞赏。

1 个答案:

答案 0 :(得分:3)

class Resource < ActiveRecord::Base
  has_many :shared_items, :dependent => :destroy

  scope :from_users_sharing_with, lambda { |user| 
    includes(:shared_item).
      where("shared_items.shared_with_id = ? OR resources.user_id = ?", user.id, user.id).
      order("shared_items.created_at DESC")
    # might need to add `select("DISTINCT resources.*")` at the end 
  }
end