小编Hak*_*onB的帖子

使用Ruby/Rails中的特定排序规则对值进行排序

是否可以使用Ruby中的特定排序规则对值数组进行排序?我需要根据da_DK排序规则进行排序.

鉴于%w(Aarhus Aalborg Assens)我想['Assens', 'Aalborg', 'Aarhus']回到的阵列,这是丹麦语的正确顺序.

标准排序方法

%w(Aarhus Aalborg Assens).sort
Run Code Online (Sandbox Code Playgroud)

返回看起来像ascii顺序的东西(至少不是丹麦语顺序):

["Aalborg", "Aarhus", "Assens"]
Run Code Online (Sandbox Code Playgroud)

环境是Snow Leopard和Linux运行ruby 1.9.2和Rails 3.0.5.

ruby ruby-on-rails collation internationalization ruby-on-rails-3

12
推荐指数
2
解决办法
2433
查看次数

将capybara从1.0.1升级到1.1.4会使database_cleaner破坏我的规格

我有一个旧的Rails应用程序升级到版本3.2.11,它有很多使用capybara版本1.0.1编写并使用selenium驱动程序运行的请求规范.使用database_cleaner使用截断策略在每次测试后清理数据库.

我想使用poltergeist而不是selenium并将capybara从1.0.1升级到1.1.4以便能够使用最新版本的poltergeist.只更改capybara gem(及其依赖项)引入了运行我的规范的问题.

在每个规范之后,我一直在清理处理程序中从Postgresql数据库中获得死锁错误.我的spec_helper很基本,看起来像这样:

RSpec.configure do |config|
  config.mock_with :rspec

  config.use_transactional_fixtures = false

  config.before(:suite) do
    DatabaseCleaner.strategy = :truncation
    DatabaseCleaner.clean_with(:truncation)
  end

  config.before(:each) do
    DatabaseCleaner.start
  end

  config.after(:each) do
    DatabaseCleaner.clean
  end
end
Run Code Online (Sandbox Code Playgroud)

我得到的错误是这样的:

An error occurred in an after hook
  ActiveRecord::StatementInvalid: PG::Error: ERROR:  deadlock detected
DETAIL:  Process 41747 waits for AccessExclusiveLock on relation 17612 of database 16396; blocked by process 41752.
Process 41752 waits for RowExclusiveLock on relation 17529 of database 16396; blocked by process 41747.
HINT:  See server log for query details.
: …
Run Code Online (Sandbox Code Playgroud)

selenium rspec ruby-on-rails capybara database-cleaner

8
推荐指数
2
解决办法
1380
查看次数

PostgreSQL在订购时忽略破折号

我有一个使用da_DK.utf8语言环境创建的PostgreSQL 8.4数据库。

dbname=> show lc_collate;
 lc_collate
------------
 da_DK.utf8
(1 row)
Run Code Online (Sandbox Code Playgroud)

当我从要在字符变化列上排序的表中选择某项时,会得到一个奇怪的行为IMO。在对结果进行排序时,PostgreSQL会忽略在值前加上前缀的破折号,例如:

 select name from mytable order by name asc;
Run Code Online (Sandbox Code Playgroud)

可能会返回类似

 name
 ----------------
 Ad...
 Ae...
 Ag...
 - Ak....
 At....
Run Code Online (Sandbox Code Playgroud)

破折号前缀似乎被忽略了。

我可以通过在订购时将列转换为latin1来解决此问题:

 select name from mytable order by convert_to(name, 'latin1') asc;
Run Code Online (Sandbox Code Playgroud)

我得到的预期结果是:

 name
 ----------------
 - Ak....
 Ad...
 Ae...
 Ag...
 At....
Run Code Online (Sandbox Code Playgroud)

为什么默认情况下,破折号前缀会被忽略?可以改变这种行为吗?

postgresql encoding utf-8 latin1

4
推荐指数
2
解决办法
2729
查看次数