プロジェクト、タスク、およびエントリを含む単純な時間追跡アプリがあります。
セットアップは簡単です:
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_scope
fromが含まれてTask
おり、その後にのみ、指定した順序が含まれます。
したがって、基本的に、プロジェクト内のすべてのエントリの最新のエントリを取得するのではなく、最初のタスクの最新のエントリのみを取得します。
それを回避する方法はありますか?モデルを無視/否定する方法が必要なようdefault_scope
ですthrough
(を完全に削除することなくdefault_scope
)