4

プロジェクト、タスク、およびエントリを含む単純な時間追跡アプリがあります。

セットアップは簡単です:

class Project < ActiveRecord::base
  has_many :tasks
  has_many :entries, :through => :tasks
end

class Task < ActiveRecord::base
  belongs_to :project
  has_many :entries

  default_scope order("name asc") # this causes problems
end

Entry完全に単純なので、省略しました)

ただし、プロジェクトから選択されたエントリのカスタム順序を実行しようとすると、問題が発生します。具体的には、次のように最新のエントリを選択しようとしています。

latest_entry = project.entries.order("created_at desc").first

しかし、:through => :tasksと がdefault_scopeあるためTask、Rails が実行する実際のクエリは次のようになります。

SELECT `entries`.* FROM `entries`
INNER JOIN `tasks` ON `entries`.`task_id` = `tasks`.`id`
WHERE `tasks`.`project_id` = 23
ORDER BY name asc, entries.date desc LIMIT 1 -- wrong order!

注意してくださいORDER BY clause- それにはdefault_scopefromが含まれてTaskおり、その後にのみ、指定した順序が含まれます。

したがって、基本的に、プロジェクト内のすべてのエントリの最新のエントリを取得するのではなく、最初のタスクの最新のエントリのみを取得します

それを回避する方法はありますか?モデルを無視/否定する方法が必要なようdefault_scopeですthrough(を完全に削除することなくdefault_scope

4

1 に答える 1

1

再注文はどうですか:

latest_entry = project.entries.reorder("created_at desc").first
于 2012-11-08T12:31:33.280 に答える