在标题中,我尝试将哈希值制作成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中充分利用正确的语法=) 谢谢!
卢卡斯。
答案 0 :(得分:1)
案例1和案例2绝对不是您想要的。 Hash需要在一个块中指定,这与FactoryGirl在包含双括号的示例中所做的相同。案例3,4和5通常会起作用但不是因为Sequel有一个特殊的语法来分配hstore列,而Fabrication不会自动为你翻译它(因为在你提起它之前我不知道这是一个东西)。
如果你改成它,我认为你会找到成功:
status do
Sequel.hstore("heol"=>"true", "hduplicate"=>"false", "hprocessed"=>"true")
end