为Postgresql构造hstore值

时间:2014-09-06 20:03:24

标签: postgresql rspec sequel hstore fabrication-gem

在标题中,我尝试将哈希值制作成hstore类型列。

我见过问题fabricator with hstore attribute,但那里的解决方案对我不起作用。

我的hstore列名是“status”,我想设置三个标志:“processed”,“duplicate”,“eol”。我正在使用续集(4.14.0)作为ORM,制作(2.8.1),Ruby 2.1.2和Postgresql当然;)

案例1:

status {eol: true, duplicate: false, processed: true}

结果:

  

语法错误

案例2:

status {"heol"=>"true", "hduplicate"=>"false", "hprocessed"=>"true"}

结果:

  

语法错误

案例3:

  status do
    {"heol"=>"true", "hduplicate"=>"false", "hprocessed"=>"true"}
  end

结果:

  

续:: DatabaseError:          PG :: DatatypeMismatch:错误:列“status”的类型为hstore,但expression的类型为boolean          第1行:...... 23.0,'2000-01-01',(('heol'='...          提示:您需要重写或转换表达式。

案例4:

status do
    {status: "heol:true"}
  end

结果:

  

失败/错误:构建(:条目)        续集:: DatabaseError:          PG :: UndefinedColumn:错误:列“status”不存在          第1行:... 123.0,'2000-01-01',(“状态”= ...          提示:表“条目”中有一个名为“status”的列,但不能从查询的这一部分引用它。

案例5:

  

状态如何       {'status'=> “heol:true”}结束

结果:

Failure/Error: Fabricate(:entry)
 Sequel::DatabaseError:
   PG::DatatypeMismatch: ERROR:  column "status" is of type hstore but expression is of type boolean
   LINE 1: ...123.0, '2000-01-01', ('status' =...
   HINT:  You will need to rewrite or cast the expression.

案例6: 放弃 ;) 结果: 这个问题

使用FactoryGirl,一切都按预期工作,语法很简单:

FactoryGirl.define do
  factory :entry do
    status {{ flag_processed: true, flag_duplicate: false }}
end

承诺在Fabrication中充分利用正确的语法=) 谢谢!

卢卡斯。

1 个答案:

答案 0 :(得分:1)

案例1和案例2绝对不是您想要的。 Hash需要在一个块中指定,这与FactoryGirl在包含双括号的示例中所做的相同。案例3,4和5通常会起作用但不是因为Sequel有一个特殊的语法来分配hstore列,而Fabrication不会自动为你翻译它(因为在你提起它之前我不知道这是一个东西)。

如果你改成它,我认为你会找到成功:

status do
  Sequel.hstore("heol"=>"true", "hduplicate"=>"false", "hprocessed"=>"true")
end