可能重复:
map(&:name)在Ruby中意味着什么?
在Ruby中,我知道如果我这样做:
some_objects.each(&:foo)
Run Code Online (Sandbox Code Playgroud)
它是一样的
some_objects.each { |obj| obj.foo }
Run Code Online (Sandbox Code Playgroud)
也就是说,&:foo创建块{ |obj| obj.foo },将其转换为Proc,并将其传递给每个块.为什么这样做?它只是一个Ruby特例,还是有理由为什么这样做呢?
有什么方法可以阻止ActiveRecord在不需要时向数据库发出SHOW FIELDS吗?
我正在研究数据库性能关键应用程序,并且注意到在典型的查询中,我的SELECT需要0.5毫秒,相关的SHOW FIELDS需要2毫秒 - 4倍长!更重要的是,它不需要,因为我已经指定了我想要检索的唯一列:
UsersAddress.find(:all, :conditions => {:user_id => 1}, :select => :address_id)
UsersAddress加载(0.5ms)SELECT address_id FROM
users_addressesWHERE(users_addresses.user_id= 1)UsersAddress列(2.1ms)显示字段
users_addresses
当然,这只会在每次第一次触摸某个表时发生一次,但不应该是可以避免完成的吗?首先,该信息已经在我的架构中.其次,我不需要它.
任何想法如何优化这样,以便Rails不会运行SHOW FIELDS,除非它真的需要它?
谢谢!
我正在尝试创建一个小小的Ruby hack来制作类似Symbol#to_proc hack的反向.符号#to_proc hack使这成为可能:
some_array.each(&:some_method)
Run Code Online (Sandbox Code Playgroud)
是相同的
some_array.each { |obj| obj.some_method }
Run Code Online (Sandbox Code Playgroud)
我想让这成为可能:
some_array.each(&[:some_method])
Run Code Online (Sandbox Code Playgroud)
会是一样的
some_array.each { |obj| some_method(obj) }
Run Code Online (Sandbox Code Playgroud)
问题是除非some_method是一个内核方法,它的真正含义是:
some_array.each { |obj| self.some_method(obj) }
Run Code Online (Sandbox Code Playgroud)
当显式传递一个块时,它会在写入这一行的绑定中创建,因此self可以正确访问当前对象,一切正常.但是,如果在Array的to_proc方法中创建块,则self在Array绑定中(并引用数组本身).也许我不可能做我想做的事,但我喜欢社区的一些想法.
到目前为止,这是我的黑客.只要该方法是一个内核方法,并且在Array中可用,它就可以工作:
class Array
def to_proc
lambda {|i| send(self.first, i)}
end
end
Run Code Online (Sandbox Code Playgroud)
有了这个黑客,这条线路工作,并把三个符号:
[:foo, :bar, :bas].each(&[:puts])
Run Code Online (Sandbox Code Playgroud)
它对我来说很有用,因为我经常发现自己想要在控制台中检查一系列ActiveRecord对象,这样我就不会输入{| i | 我把.但是能够在对象中使用它会更有用,这样对象中的某些方法就会被调用,并且数组中的每个项都作为参数传递.
那么任何想法如何使绑定问题工作?
请不要同时回答"你不想这样做,因为它会让事情变得更慢"或"你没有保存这么多字符打字,但这会让代码更不易读" - 我知道这些事情已经.:)这更像是一种喂养我好奇心的黑客行为.只是想知道是否可能.
我遇到了一些奇怪的问题,我的delayed_jobs在生产中失败了.最后,我把它缩小到记录器.如果我注释掉我的日志函数调用,一切正常.但是,如果我尝试登录,我会在delayed_job处理程序中得到这个:
--- !ruby/struct:Delayed::PerformableMethod
object: AR:User:1
method: :load_and_update_without_send_later
args: []
| closed stream
/opt/ruby/lib/ruby/1.8/logger.rb:504:in `write'
/opt/ruby/lib/ruby/1.8/logger.rb:504:in `write'
/opt/ruby/lib/ruby/1.8/monitor.rb:242:in `synchronize'
/opt/ruby/lib/ruby/1.8/logger.rb:496:in `write'
/opt/ruby/lib/ruby/1.8/logger.rb:326:in `add'
/opt/ruby/lib/ruby/1.8/logger.rb:374:in `info'
/home/rails/myapp.com/releases/20100203203031/app/models/gmail.rb:35:in `log'
Run Code Online (Sandbox Code Playgroud)
我的记录器看起来像这样:
@@error_log_file = File.open("#{RAILS_ROOT}/log/error.log", 'a')
@@error_log_file.sync = true
def log(msg)
msg.each do |line|
line = "#{Time.now.strftime('%H:%M:%S')} #{line}"
@@error_log_file.info(line) # this is line 35 where it's failing
puts line
end
end
Run Code Online (Sandbox Code Playgroud)
如果我注释掉"@@ error_log_file.sync = true"这一行,它也可以.
这是一个延迟的工作问题,还是可能与我的日志目录是一个符号链接(由标准capistrano部署设置)?
此外,我的error.log文件中没有写入任何内容,也没有任何内容写入delayed_job.log.完全难倒......