【问题标题】:Rails object cannot list values where Boolean is trueRails 对象无法列出布尔值为真的值
【发布时间】: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(&amp;:created_at)

【问题讨论】:

  • 'false'false 是两个不同的东西。小心点。
  • 另外,你是如何调用默认方法的?也许您在不应该调用此方法的情况下调用此方法,并且在实例化对象时它会覆盖 settled 的值?
  • 非常感谢@RobW。你给我指出了正确的方向。我将在编辑中解释。
  • @tadman 你是对的,布尔值是语法混乱,cf 编辑
  • 看来你的想法是对的。您应该将其添加为答案。

标签: ruby-on-rails list boolean where


【解决方案1】:

编辑 - 问题的解决方案 1) 我删除了默认功能,因为它阻止了任何进一步的覆盖。相反,我编写了一个迁移来添加默认值,按照这个非常有趣的线程正确的方法在 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 do |deal| 
  deal.settled == 't'
end.sort_by(&:created_at)

【讨论】:

    猜你喜欢
    • 2015-04-01
    • 2012-06-08
    • 2014-04-25
    • 2020-06-13
    • 1970-01-01
    • 2013-06-05
    • 1970-01-01
    • 2021-12-01
    • 1970-01-01
    相关资源
    最近更新 更多