在Ruby 1.8.6中,我有一个数组,比如100,000个用户id,每个用户id都是一个int.我想在这些用户ID上执行一段代码,但我想以块的形式执行.例如,我想一次处理100个.我怎样才能尽可能简单地实现这一目标?
我可以做类似下面的事情,但可能有一个更简单的方法:
a = Array.new
userids.each { |userid|
a << userid
if a.length == 100
# Process chunk
a = Array.new
end
}
unless a.empty?
# Process chunk
end
Run Code Online (Sandbox Code Playgroud) 我正在使用Rails 2.3.x. 我想要一小段代码运行,当且仅当它config.cache_classes
是真的.默认情况下,这对于生产是正确的,对于开发来说是错误的.
如何从environment.rb,development.rb和production.rb文件外部访问config.cache_classes的值?很容易判断我们是否处于生产或开发阶段,Rails.env
会给我们答案.但是不能保证开发人员没有config.cache_classes = true
开发.
我当然明白,您通常不希望在开发和生产中运行单独的代码路径.在这个特定的例子中,我们根本就没有在启动时执行某些工作; 如果我们以后需要执行它,我们将在开发和生产中这样做.
我想从一个字符串中删除Ruby中的前导和尾随引号.引号字符将出现0或1次.例如,以下所有内容都应转换为foo,bar:
"foo,bar"
"foo,bar
foo,bar"
foo,bar
在C++中交叉两个集合的标准方法是执行以下操作:
std::set<int> set_1; // With some elements
std::set<int> set_2; // With some other elements
std::set<int> the_intersection; // Destination of intersect
std::set_intersection(set_1.begin(), set_1.end(), set_2.begin(), set_2.end(), std::inserter(the_intersection, the_intersection.end()));
Run Code Online (Sandbox Code Playgroud)
我该怎么做一个就地设置交叉点?也就是说,我希望set_1具有对set_intersection的调用结果.显然,我可以做一个set_1.swap(the_intersection)
,但这比现场交叉效率要低得多.
请原谅我在术语上的任何错误.特别是,我使用的是关系数据库术语.
有许多持久的键值存储,包括CouchDB和Cassandra,以及许多其他项目.
反对它们的典型论点是它们通常不允许跨多个行或表的原子事务.我想知道是否有一般方法可以解决这个问题.
以一组银行账户的情况为例.我们如何将钱从一个银行账户转移到另一个银行账户?如果每个银行帐户都是一行,我们希望将两行更新为同一事务的一部分,从而减少一个值并增加另一个值.
一种显而易见的方法是使用一个描述事务的单独表.然后,将钱从一个银行账户转移到另一个银行账户只需在该表中插入一个新行即可.我们不存储两个银行账户中任何一个的当前余额,而是依赖于汇总交易表中的所有相应行.然而,很容易想象这将是太多的工作; 银行每天可能有数百万笔交易,而个人银行账户可能很快就会有数千笔与之相关的"交易".
如果基础数据自上次抓取以来发生了变化,那么一些(全部?)键值存储将"回滚"一个动作.可能这可能用于模拟原子事务,然后,您可以指示特定字段被锁定.这种方法存在一些明显的问题.
还有其他想法吗?我的方法完全有可能是错误的,我还没有围绕新的思维方式包围我的大脑.
我已成功制作,提交并推送更改到中央git存储库.我现在意识到我要标记所有文件的当前版本.所以我这样做:
git tag -a 0.5
Run Code Online (Sandbox Code Playgroud)
这成功了.但现在我尝试了一下git push
,我被告知没有什么可以承诺的.如何将新标签推送到中央存储库?
(注意git tag
显示标记0.5,但仅在本地)
我们有一个(目前是InnoDB)表,其中包含大约500,000行.这表示要运行的任务队列.它存储在MySQL数据库中.
一个连续的基础,至少每秒一次,但有时更频繁,我们从中选择数据,然后更新一些行.每天一次,我们从表中修剪旧行.
我们开始在桌面上遇到僵局,这使我们的任务处理停滞不前.这些僵局是在夜间修剪过程中造成的.DELETE,SELECT和UPDATE的组合意味着基本上没有任何生产力可能发生.遗憾的是,我没有SHOW ENGINE INNODB STATUS的输出.
我想知道解决这个问题的最佳选择.请注意,我们的代码会检测死锁并重新发出查询.此外,我们很久以前就发现一次删除所有匹配的行对于看到大量活动的数据库表太过费力,所以我们一次将删除限制为10,000行,并继续重新发出查询,直到所有必要的行都被删除为止.修剪.
我看到以下选项,并希望哪些是最好的意见,或其他选项的建议:
如果我想在Ruby中交错一组数组,并且每个数组的长度相同,我们可以这样做:
a.zip(b).zip(c).flatten
Run Code Online (Sandbox Code Playgroud)
但是,如果阵列的大小不同,我们如何解决这个问题呢?
我们可以这样做:
def interleave(*args)
raise 'No arrays to interleave' if args.empty?
max_length = args.inject(0) { |length, elem| length = [length, elem.length].max }
output = Array.new
for i in 0...max_length
args.each { |elem|
output << elem[i] if i < elem.length
}
end
return output
end
Run Code Online (Sandbox Code Playgroud)
但有没有更好的'Ruby'方式,也许使用zip或转置或其他一些?
我们有代码在Ruby 1.8.6 Web应用程序中记录数据.你大致如下调用它:
$log.info("Some text here")
Run Code Online (Sandbox Code Playgroud)
现在,在记录的输出中,我想要包含出现该行的模块.我知道Kernel#caller
会给我一个数组,我可以提取日志行发生的文件和行号,但我不希望这样.我想要模块,而不是文件名.显而易见的解决方案是修改日志行,使其如下所示:
$log.info("Some text here", self.class.name)
Run Code Online (Sandbox Code Playgroud)
然后解析结果.但是,这不会起作用,因为我试图在默认情况下提取此信息.也就是说,如果程序员忘记指定模块,那么我需要解决方案才能工作,这是日志行的第二个参数.
有没有办法做到这一点?如果没有,我将只需要处理caller
数组; 我们的大多数模块都在不同的目录中,因此这将是一个80%的解决方案.
更完整的示例,请原谅轻微的语法错误:
在文件log.rb中:
module Log
class Logger
def info(msg, mod = '')
puts "Module: #{mod} Msg: #{msg}"
end
end # class Logger
end # module Log
$log = Log::Logger.new
Run Code Online (Sandbox Code Playgroud)
在文件foo.rb中:
module Foo
class Bar
def do_something
# Do not pass in self.class.name.
# We want the output to look like:
# Module: Foo Msg: I did something!
$log.info "I did something!"
end
end …
Run Code Online (Sandbox Code Playgroud)