关于find方法中boolean型的问题
悬赏:5 发布时间:2009-04-18 提问人:阿拉觉得方腊; (初级程序员)
Message.find(:first, :conditions => {:read => true})
=> #
为什么上面的方法可以,下面的方法就不行
其中t.column :read, :boolean
谢谢指点!
Message.find(:first, :conditions => ['read = ?', true])
ActiveRecord::StatementInvalid: Mysql::Error: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'read = 1) LIMIT 1' at line 1: SELECT * FROMmessages
WHERE (read = 1) LIMIT 1
from /usr/lib/ruby/gems/1.8/gems/activerecord-2.2.2/lib/active_record/connection_adapters/abstract_adapter.rb:188:inlog'
execute'
from /usr/lib/ruby/gems/1.8/gems/activerecord-2.2.2/lib/active_record/connection_adapters/mysql_adapter.rb:309:in
from /usr/lib/ruby/gems/1.8/gems/activerecord-2.2.2/lib/active_record/connection_adapters/mysql_adapter.rb:563:inselect'
select_all_without_query_cache'
from /usr/lib/ruby/gems/1.8/gems/activerecord-2.2.2/lib/active_record/connection_adapters/abstract/database_statements.rb:7:in
from /usr/lib/ruby/gems/1.8/gems/activerecord-2.2.2/lib/active_record/connection_adapters/abstract/query_cache.rb:62:inselect_all'
find_by_sql'
from /usr/lib/ruby/gems/1.8/gems/activerecord-2.2.2/lib/active_record/base.rb:635:in
from /usr/lib/ruby/gems/1.8/gems/activerecord-2.2.2/lib/active_record/base.rb:1490:infind_every'
find_initial'
from /usr/lib/ruby/gems/1.8/gems/activerecord-2.2.2/lib/active_record/base.rb:1452:in
from /usr/lib/ruby/gems/1.8/gems/activerecord-2.2.2/lib/active_record/base.rb:587:in `find'
from (irb):3
[b]问题补充:[/b]
我的问题是文什么上面的行,下面的不行。
而且我成功执行过,Album.find(:first, :conditions => ['user_id = ? and id = ? and active = ?',1,3, true])
=> #
我感觉就是很矛盾很困惑,怎么有的可以,有的不可以,
问题在于:
read这个字段名,也就是说你把字段名改成read1,再写就两种查询都可以用了。
那么,为什么read做字段名
[code="ruby"]Message.find(:first, :conditions => {:read => true}) [/code]
仍然,可以用呢?
因为,对于Rails而言,两种查询转换成的sql语句不太一样,
[code="ruby"]Message.find(:first, :conditions => ['read = ?', true]) [/code]
会转换成:
[code="sql"]SELECT * FROM messages
WHERE (read = 1) LIMIT 1[/code]
这时就会有保留字做属性名的语法错误,当然,你把read改成read1是不会出错的。
但是,
[code="ruby"]Message.find(:first, :conditions => {:read => true})[/code]
会转换成
[code="sql"]SELECT * FROM messages
WHERE (messages
.read
= 1) LIMIT 1[/code]
当然,就不会有属性名是保留字的错误。
至于
[code="ruby"]Album.find(:first, :conditions => ['user_id = ? and id = ? and active = ?',1,3, true]) [/code]
能执行,自然是因为,没有保留字的原因了。
:arrow:
你写的sql语句有语法错误
Mysql::Error: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'read = 1) LIMIT 1' at line 1:
这个sql你直接到数据库那去跑一下就知道哪里错了
SELECT * FROM messages
WHERE (read = 1) LIMIT 1
你用的应该是mysql,但mysql没有boolean,只有tinyint(1),这种你没必要用boolean,就用int(1)就可以啊!
很奇怪,我安裝你的方法測試了
在我本地是可以成功的~
第二种写法,他是把'true看做1,来拼语句的!所以没有达到变量的目的,所以我觉得,这种最好是int,0,1这样比较好!
赞美LS,好仔细