1.使用 ||= 缓存实例变量,曾快查询时间
def current_user
@current ||= User.find_by(id: session[:user_id])
end
2.动态查询方法(rails 4已经移除)
def incomplete
@tasks = Task.find_all_by_complete(false)
#rails 4的用法应该
@tasks = Task.find(complete: false)
end
def last_incomplete
@task = Task.find_by_complete(false, :order => 'created_at DESC')
#rails 4的用法应该
@tasks = Task.find(complete: false)
end
3.通过模型关系查询
def show
@project = Project.find(params[:id])
@tasks = @project.tasks.find_all_by_complete(false)
#rails 4的用法应该
@tasks = @project.tasks.find(complete: false)
end
4.自定查询方法
tasks_controller.rb
def index
@tasks = Task.find_incomplete
end
models/task.rb
def self.find_incomplete
find_all_by_complete(false, :order => 'created_at DESC')
#rails4的查询方法
find(complete: false, order: "created_at DESC")
end
projects_controller.rb
def show
@project = Project.find(params[:id])
@tasks = @project.tasks.find_incomplete
end
5.通过to_proc为代码块逻辑命名
首先在project模型中我们有两条数据[#<Project id: 1, name: "Write another ASCIIcast", created_at: "2008-12-29 09:32:47", updated_at: "2008-12-29 09:32:47">, #<Project id: 2, name: "Go out walking", created_at: "2008-12-29 09:33:04", updated_at: "2008-12-29 09:33:04">]
>> projects.collect {&:name}
=> ["Write another ASCIIcast", "Go out walking"]
或者使用链式操作
>> projects.collect(&:name).collect(&:upcase)
=> ["WRITE ANOTHER ASCIICAST", "GO OUT WALKING"]
我们也可以应用到其他的查询
>> projects.all?(&:valid?)
=> true
>> projects.any?(&:valid?)
=> true
>> projects.each(&:save!)
=> [#<Project id: 1, name: "Write another ASCIIcast", created_at: "2008-12-29 09:32:47", updated_at: "2008-12-29 09:32:47">, #<Project id: 2, name: "Go out walking", created_at: "2008-12-29 09:33:04", updated_at: "2008-12-29 09:33:04">]
所以我们直接可以模型中定义一个方法:
class Project < ActiveRecord::Base
has_many :tasks
def self.all_names
all.collect(&:name)
end
end
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。