【发布时间】:2015-08-26 09:05:38
【问题描述】:
编辑 - 现在已解决。见帖子底部。感谢 Rob.W 指出我的默认方法覆盖了所有内容,即使我尝试更新值
我无法在我的数据库中列出属性“已解决”设置为 true 的所有“交易”。正如您将在 Rails 控制台的以下脚本中看到的那样,我将一个对象更新为 true,rails 确认更新,但之后该对象仍显示为 false
我尝试了各种语法,有或没有“”等,看过类似的问题,但他们没有解决我的问题。
1) 数据库中没有任何显示为真:
[2] pry(main)> Deal.where(settled: true)
...
=> []
2) 所以我自己更新了一个,rails 确认
[3] pry(main)> Deal.find(73).update(settled: true)
...
=> true
3) 这是奇怪的部分:对已结算为 true 的交易的查询返回我刚刚创建的交易...但它显示为假!
[4] pry(main)> Deal.where(settled: true)
Deal Load (0.8ms) SELECT "deals".* FROM "deals" WHERE "deals"."settled" = 't'
=> [#<Deal:0x007fad593dc468
id: 73,
amount: 45.0,
description: "no description yet",
settled: false,
created_at: Wed, 10 Jun 2015 19:52:05 UTC +00:00,
updated_at: Wed, 10 Jun 2015 21:14:36 UTC +00:00,
payer_id: 55,
receiver_id: 57>]
请注意,在 Deal 模型的 deal.rb 文件中,我有以下内容将默认值 false 设置为 'settled'
def defaults
self.description = 'no description yet'
self.settled = 'false'
end
编辑 - 问题的解决方案 1)我删除了默认功能,因为它阻止了任何进一步的覆盖。相反,根据这个非常有趣的线程,我编写了一个迁移来添加默认值 How to set default values in Rails?
def change
change_column :table_name, :column_name, :type, default: "Your value"
end
2) 最后一个技巧是查询真值的语法。在 self.update(settled: true) 后,rails 为对象赋予值“t”,而不是 true,而不是 'true' - 因此正确的查询代码是
@history = current_user.all_deals.select {|deal| deal.settled == 't'}.sort_by(&:created_at)
【问题讨论】:
-
'false'和false是两个不同的东西。小心点。 -
另外,你是如何调用默认方法的?也许您在不应该调用此方法的情况下调用此方法,并且在实例化对象时它会覆盖
settled的值? -
非常感谢@RobW。你给我指出了正确的方向。我将在编辑中解释。
-
@tadman 你是对的,布尔值是语法混乱,cf 编辑
-
看来你的想法是对的。您应该将其添加为答案。
标签: ruby-on-rails list boolean where