Rails对象无法列出布尔值为true的值

时间:2015-06-10 21:37:21

标签: ruby-on-rails list boolean where

编辑 - 现在解决了。见帖子的底部。感谢Rob.W指出我的默认方法是覆盖了所有内容,即使我试图更新值

我不能列出所有" Deals"在我的数据库中,属性“已解决”#39;设置为true。正如您将在rails控制台的下面脚本中看到的那样,我将对象更新为true,rails确认更新,但之后对象仍显示为false

我尝试了各种语法,无论有没有""等,都看过类似的问题,但他们没有解决我的问题。

1)db中没有显示任何内容:

[2] pry(main)> Deal.where(settled: true)
  ...
=> []

2)所以我自己更新一个,并且rails确认

[3] pry(main)> Deal.find(73).update(settled: true)
...
=> true

3)这是一个奇怪的部分:对已结算的真实交易的查询返回我刚刚创建的那个......但是它显示好像是假的!

[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设为&#39;已结算&#39;

  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(已解决:true)时,rails为对象提供值&#34; t&#34;,而不是true,不是&#39; true&#39; - 因此,正确的查询代码是

@history = current_user.all_deals.select {|deal| deal.settled == 't'}.sort_by(&:created_at)

1 个答案:

答案 0 :(得分:0)

编辑 - 问题的解决方案1)我删除了默认功能,因为它阻止了任何进一步的覆盖。相反,我写了一个迁移来添加默认值,根据这个非常有趣的线程在Rails中设置默认值的正确方法

def change
    change_column :table_name, :column_name, :type, default: "Your value"
end

2)最后一招是查询真值的语法。在self.update(sett:true)下,rails给对象赋值“t”,而不是true,而不是'true' - 因此查询的正确代码是

@history = current_user.all_deals.select do |deal| 
  deal.settled == 't'
end.sort_by(&:created_at)