这个例子中我们有一个Project
类,其中通过has_many
方法定义包含多个Task
:
class Project < ActiveRecord::Base
has_many :tasks
end
在Task
任务类中通过belongs_to
定义它属于一个Project
:
class Task < ActiveRecord::Base
belongs_to :project
end
项目类的控制器ProjectsController
中定义了一个show
方法,用来返回一个项目及其包含的未完成项目供前台页面展示。通过调用Task
类的find
方法找到满足project_id
与Project
的id
并且complete
属性是false
条件的所有任务。
class ProjectsController < ApplicationController
def show
@project = Project.find(params[:id])
@tasks = Task.find(:all, :conditions => ['project_id = ? AND complete = ?', @project.id, false])
end
end
当然还有更好的解决方案,可以使用find
的级联查询功能。代码中如下的行可以被替换
@tasks = Task.find(:all, :conditions => ['project_id = ? AND complete = ?', @project.id, false])
至
@tasks = @project.tasks.find(:all, :conditions => [complete = ?', false])
这意味着可以从find
命令中不指定project_id
参数,因为我们就是在我们要的那个那个Project对象上调用查询的Task查询方法的。
用#2视频讲到的动态字段查询方法可以进一步进行简化:
@tasks = @project.tasks.find_all_by_complete(false)