Task has_one :completed_task
CompletedTask belongs_to :task
named_scope :incomplete_tasks, :conditions => 'not exists (select 1 from completed_tasks where tasks.id = completed_tasks.task_id')
left outer join
null
completed_task
:select
named_scope :incomplete_tasks, :select => 'tasks.*',
:joins => 'left outer join completed_tasks on tasks.id = completed_tasks.task_id'
:conditions => 'completed_tasks.id is null'
第一种方法肯定更具可读性,但子选择在某些数据库上的性能较差,所以给他们一个机会来决定