小编Edm*_*Lee的帖子

Rails 4.2 Postgres 9.4.4 statement_timeout 不起作用

我正在尝试设置 statement_timeout。我在database.yml文件中尝试了这样的设置

variables:
  statement_timeout: 1000
Run Code Online (Sandbox Code Playgroud)

和这个

ActiveRecord::Base.connection.execute("SET statement_timeout = 1000")
Run Code Online (Sandbox Code Playgroud)

测试过

ActiveRecord::Base.connection.execute("select pg_sleep(4)")
Run Code Online (Sandbox Code Playgroud)

而且两者都没有任何作用。

我在本地运行 postgres 10 并且 statement_timeouts 工作正常。但是在我运行 postgres 9.4.4 的服务器上,它根本没有做任何事情。

我已经检查了Postgres 的 9.4 文档,并且 statement_timeout 可用。任何人都可以透露一些信息吗?

postgresql ruby-on-rails

11
推荐指数
1
解决办法
605
查看次数

使用Rspec + Factory Girl在新线程/进程测试中数据库为空

关注此博客文章,http://blog.arkency.com/2015/09/testing-race-conditions/

我试图测试并发性.但在我的规格中,当我启动新线程或分叉进程时,我无法找到记录.

describe 'test concurrency' do
  let(:order_1) { create(:order) }
  let(:order_2) { create(:order) }
  let(:order_3) { create(:order) }
  let(:order_4) { create(:order) }
  let(:product) { create(:product) }

  it 'test concurrency' do
    wait_for_all_threads = true
    product.update(quantity_available: 4, quantity_sold: 0, quantity_in_carts: 0)
    orders = [order_1, order_2, order_3, order_4]

    # Objects are persisted in here
    # because order_n.persisted => true
    # product.persisted => true
    # product.reload works without issue (and this is essentially what causes the RecordNotFound error in Order#add_item)

    threads = orders.map …
Run Code Online (Sandbox Code Playgroud)

ruby multithreading rspec ruby-on-rails factory-bot

5
推荐指数
1
解决办法
452
查看次数

在 Mac 上使用环境变量的钥匙串密码

很多时候,我们需要在开发环境的环境变量中设置密码。但我喜欢将我的点文件放在 GitHub 上,这样我就可以拥有高度可移植的设置。

然而,为了将密码放在 GitHub 上,或者只是一般情况下,在这些点文件中保留任何密码绝对不是一个好主意。

Mac 配备了钥匙串,可以加密和存储密码。我如何利用它来保存密码并将其设置在环境变量中?

特别是,我可以将 shell 脚本放入文件.bashrc中,当我打开新的 Bash 会话时将加载该脚本。

bash shell

4
推荐指数
1
解决办法
2667
查看次数

如何使用正则表达式在ruby中交换字符串中的数字位置?

假设我有一个字符串"2foo9 8bar5".我需要交换包裹每个单词的两个数字.结果应该是这样的"9foo2 5bar8".

我可以用以下代码完成.

def swap_num(str)
  str = str.gsub(/(\d)(\D+)(\d)/, '\3\2\1')
end
Run Code Online (Sandbox Code Playgroud)

但是如果我有这样的字符串"2foo9 8bar5 3+=_1",这个swap_num方法也会交换最后一部分的数字"3+=_1",这不是我想要的.我只想交换包装WORDS的数字,而不是任何字符.

我尝试了以下,但没有奏效.

def swap_num(str)
  str = str.gsub(/(\d)([a-zA-Z]+)(\d)/, '\3\2\1')
end
Run Code Online (Sandbox Code Playgroud)

用简单的正则表达式做任何事情?谢谢!

更新:

对不起大家.我犯了一个错误,str = str.gsub(/(\d)([a-zA-Z]+)(\d)/, '\3\2\1')实际上是我的目的.但是如果我使用这样的双引号就行不通"\3\2\1".

谢谢,@ Robin指出我的原始代码实际工作.还要感谢@Cary Swoveland和@ Andie2302为我提供2个新的解决方案!真的很感激!

ruby regex

2
推荐指数
1
解决办法
496
查看次数

在Ruby中将数据从大型CSV(或数据流)有效地导入Neo4j

我是后台流程的新手,所以如果我做错了假设,请随时指出。

我正在尝试编写一个脚本,用于将导入数据从大型CSV文件导入Neo4j db(将其视为数据流,无休止地)。csv文件仅包含两列-user_a_id和user_b_id,它们映射有向关系。需要考虑的几件事:

  1. 数据可能重复
  2. 同一用户可以映射到其他多个用户,并且不能保证该用户何时会再次显示。

我当前的解决方案:我正在使用sidekiq,并且有一个工作人员批量读取文件,并分派工作人员在数据库中创建边。

我遇到的问题:

  1. 由于我正在接收数据流,因此无法对文件进行预排序并为一个用户分配建立关系的作业。
  2. 由于作业是异步执行的,因此如果两个工作人员正在处理同一节点的关系,我将获得Neo4j的写锁。
  3. 假设我绕过写锁,如果两个工作人员正在处理重复的记录,那么我将构建重复的边。

可能的解决方案:建立一个同步队列,并且只有一个工作线程来执行写操作(似乎sidekiq或resque都没有该选项)。这可能非常慢,因为只有一个线程在工作。

或者,我可以编写自己的实现,该实现创建一个工作程序以根据user_id(每个队列一个唯一的ID)构建多个作业队列,并使用Redis进行存储。然后,为每个队列分配一个工作线程以写入数据库。设置最大队列数,这样我就不会用完内存,并在队列耗尽所有作业后将其删除(如果以后会看到相同的user_id,请重新构建它)。-虽然听起来并不简单,所以我更喜欢在使用之前使用现有的库。

我的问题是-是否可以使用现有的宝石?处理此问题的良好做法是什么?

ruby multithreading backgroundworker neo4j

1
推荐指数
1
解决办法
470
查看次数

在ruby && =运算符是片状?

在Ruby中遇到了一种奇怪的行为.不知道这只是我.我在ruby 2.3.3上.这是日志.按顺序操作它们,你应该能够重现它.

[1] pry(main)> a &&= nil.a
=> nil
[2] pry(main)> a &&= 1.to_s
=> nil
[3] pry(main)> a = 1 && 1.to_s
=> "1"
[4] pry(main)> a &&= 1.to_s
=> "1"
[5] pry(main)> a &&= nil.a
NoMethodError: undefined method `a' for nil:NilClass
from (pry):5:in `__pry__'
Run Code Online (Sandbox Code Playgroud)

1和[5],以及2和[4]

编辑:

在SO上有一个类似的问题.还有一篇试图解释它的博客文章.但我不认为他们会解释它.

SO线程中,它表示&&=是一个快捷方式x = x && y if x.但考虑一下:

num = 1
a &&= num.to_s
# …
Run Code Online (Sandbox Code Playgroud)

ruby

0
推荐指数
1
解决办法
127
查看次数