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

天赢金创
338 声望21 粉丝

天赢金创,天赢金创,天赢金创,天赢金创,天赢金创,天赢金创天赢金创,天赢金创


引用和评论

0 条评论