2013-04-05 43 views
1

我有一個用狀態標誌(這是一個tinyint(1))定義的mysql表。 但是,當我嘗試檢查值是真還是假時,我似乎得出了錯誤的結果。也就是說,它不會看到該值作爲一個合法的真或價值,而是測試的,如果它不是「無」或類似的 - 因此我的「似乎沒有工作」Ruby TinyInt(1)?

results.each_hash do |row| 
# What I tried 

# (a) 
if row['status'] 
    # do something - doesn't seem to work 
end 

# (b) 
if row['status'].to_i == 1 
    # this seems correct 
end 

# (c) 
if row['status'] == false 
    # doesn't seem to work 
end 
end 

什麼是正確的方法檢查這個值(tinyint(1)),因爲它應該是Ruby中的TrueClass或FalseClass;然而(c)本身不起作用。

這是我所使用的參考 - 我假定這應該在導軌和紅寶石本身適用(除非ActiveRecord的做的工作) - http://www.orthogonalthought.com/blog/index.php/2007/06/mysql-and-ruby-on-rails-datatypes/

+0

TinyINT get的解釋在大多數語言中C#等是「布爾」,抱歉,Ruby也是如此(應該將它看作TRUECLASS或FALSECLASS) – 2013-04-05 10:38:03

回答

2

active_record-3.2.13abstract_mysql_adapter.rb代碼行96:

# By default, the MysqlAdapter will consider all columns of type <tt>tinyint(1)</tt> 
    # as boolean. If you wish to disable this emulation (which was the default 
    # behavior in versions 0.13.1 and earlier) you can add the following line 
    # to your application.rb file: 
    # 
    # ActiveRecord::ConnectionAdapters::Mysql[2]Adapter.emulate_booleans = false 
+0

謝謝 - 所以Active Record認爲它是Bool和Ruby(獨立的)認爲它是簡單的int 。謝謝 – 2013-04-05 10:59:09

+0

Ruby本身不會說數據庫。如果您使用的是ActiveRecord,無論您是在Rails中還是僅在非Rails項目中使用ActiveRecord gem,都應該應用相同的數據轉換。如果你在Rails之外使用ActiveRecord,你可能會缺少Rails提供的一些配置。如果你根本沒有使用ActiveRecord(例如mysql2 gem),那麼你必須參考該文檔。 – 2013-04-05 13:24:30