论坛首页 编程语言技术论坛

Dynamic find_by Methods

浏览 5851 次
精华帖 (1) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (11)
作者 正文
   发表时间:2009-07-29   最后修改:2009-07-29
下面是一个查找未完成的任务的model:
class TaskController < ApplicationController  
    def incomplete  
        @tasks = Task.find(:all, :conditions => ['complete = ?', false])  
    end  
  
    def last_incomplete   
        @task = Task.find(:first, :conditions => ['complete =?', false], :order => 'created_at DESC')  
    end  
end  

用find_by可以更优雅的实现:
class TaskController < ApplicationController  
    def incomplete  
       @tasks = Task.find_all_by_complete(false)    
    end  
  
    def last_incomplete   
        @task = Task.find_by_complete(false, :order => 'created_at DESC')   
    end  
end  



find_by方法带order参数和find方法的一样。

   怎么发论坛来了。。搞错了....................
为什么发到论坛的东西自己删不掉呢?这不合理






   发表时间:2009-07-29   最后修改:2009-07-29
引用
def last_incomplete    
      @task = Task.find_by_complete(false,rder => 'created_at DESC')    
end 


感觉你这个其实可以讨论一下
one 这种封装到底有没有用
two 这种作用有多大,有没有过度封装的嫌疑
0 请登录后投票
   发表时间:2009-07-29  
下一站,火星 写道
引用
def last_incomplete    
      @task = Task.find_by_complete(false,rder => 'created_at DESC')    
end 


感觉你这个其实可以讨论一下
one 这种封装到底有没有用
two 这种作用有多大,有没有过度封装的嫌疑


1:将其封装为一个 helper 方法或者 controller 方法的确没必要,应该是将它移到 Model 中作为 self method,这样这个方法在 association 中也可以用,这样才有意义。

2:动态方法在网站开发初期还是不错的,可以写出简洁易懂的代码,但是到了后期,多半会重构为 :conditions query , 因为 method_missing 毕竟还是有性能损失的。
0 请登录后投票
   发表时间:2009-07-29  
1.嗯,放在model更好一些:
class Task < ActiveRecord::Base  
  belongs_to :project  
  
  def self.find_incomplete(options = {})  
    with_scope :find => options do  
      find_all_by_complete(false, :order => 'created_at DESC')  
    end  
  end  
end  


2.
引用
Make it Work, Make it Clean, Make it Fast (if necessary)

如果真有性能的需要可以加硬件设备,人家校内网都5000台服务器了http://www.programmer.com.cn/419/
如果有时间优化重构,先优化一下前端吧
PS:如果性能真的那么重要,像haml这些东西就没有存在的意义了。

0 请登录后投票
   发表时间:2009-07-29  
对于这种代码重构,我个人比较喜欢named_scope
class Task < ActiveRecord::Base    
  named_scope :incomplete, :conditions => "complete = false"
  named_scope :latest, :order => "created_at desc"
end

@tasks = Task.incomplete
@tasks = Task.incomplete.latest


我使用Dynamic find比较多的地方在和initialize共用,比如记录用户访问他人博客的功能:
Visit.find_or_initialize_by_user_id_and_visitor_id(@user.id, current_user.id).update_attribute(:visited_at, Time.now)
0 请登录后投票
   发表时间:2009-07-29  
Hooopo 写道

2.
引用
Make it Work, Make it Clean, Make it Fast (if necessary)

如果真有性能的需要可以加硬件设备,人家校内网都5000台服务器了http://www.programmer.com.cn/419/
如果有时间优化重构,先优化一下前端吧
PS:如果性能真的那么重要,像haml这些东西就没有存在的意义了。



校内网只是个特例,大多数公司的网站不会超过5台服务器,你去看看 robbin 的 twitter, javaeye 也三年了,他现在买台服务器也要考虑再三, 还在不停地想法榨干服务器最后一点优化性能的可能,都说横向扩展,但是实际应用中成本的考虑更多一些。而这里大多数人做网站也许一辈子也不会管理超过三台服务器,所以有的新闻只是新闻,有时候对个人和公司来说连参考价值都没有。

PS: ERB,builder 的性能确实要比 HAML 好一些(现在haml差距也不是很大了), 如果只是做输出 xml 的 service 应用,那么 haml 还真没必要用。
参看:
http://ridingtheclutch.com/2009/07/13/the-ultimate-ruby-performance-test-part-1.html
0 请登录后投票
   发表时间:2009-07-29  
QuakeWang 写道
对于这种代码重构,我个人比较喜欢named_scope


的确楼主的那些重构, rails 后来版本中的 named_scope 是最好的方式,现在自己写这种 condition query method 已经很少了。
0 请登录后投票
   发表时间:2009-07-29  
Hooopo 写道
1.嗯,放在model更好一些:
class Task < ActiveRecord::Base  
  belongs_to :project  
  
  def self.find_incomplete(options = {})  
    with_scope :find => options do  
      find_all_by_complete(false, :order => 'created_at DESC')  
    end  
  end  
end  


2.
引用
Make it Work, Make it Clean, Make it Fast (if necessary)

如果真有性能的需要可以加硬件设备,人家校内网都5000台服务器了http://www.programmer.com.cn/419/
如果有时间优化重构,先优化一下前端
PS:如果性能真的那么重要,像haml这些东西就没有存在的意义了。



系统的瓶颈往往在数据库,你数据库都快累了,你前端搞得在华丽有啥用?另外增加硬件并没有你想象的那么简单,这种server farm往往都需要一个庞大的团队维护,人家校内有几个亿的投资,你怎么不去比?
0 请登录后投票
   发表时间:2009-07-29   最后修改:2009-07-29
前端优化又不是美化,和华丽有什么关系?

这是《高性能网站建设指南》一书推荐的前端优化指南:
http://www.douban.com/subject/3132277/
引用


主要包括减少HTTP请求、Edge Computing技术、Expires Header技术、Gzip组件、CSS和JavaScript最佳实践、主页内联、Domain最小化、JavaScript优化、避免重定向的技巧、删除重复JavaScript的技巧、关闭ETags的技巧、Ajax缓存技术和最小化技术等


相信这些还是有点用的.........
0 请登录后投票
   发表时间:2009-07-31   最后修改:2009-07-31
关于这种状态型的查询,建议引入状态机,配合一些named_scope小技巧:
http://www.iteye.com/topic/412610?page=2#1081161
实现 Task.completed 这种查询 简单有效又优雅

是的,我在卖瓜
0 请登录后投票
论坛首页 编程语言技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics