這個例子中我們有一個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)
作者授權:You are welcome to post the translated text on your blog as well if the episode is free(not Pro). I just ask that you post a link back to the original episode on railscasts.com.
原文鏈接:http://railscasts.com/episodes/3-find-through-association