mysql - 为什么部署环境中的 Model.find 行为与开发环境中的不同?

标签 mysql ruby-on-rails ruby sqlite3-ruby

将 Ruby on Rails 与 capistrano 和 git 结合使用,我遇到了一个烦人的问题..

我有一个 Controller “people”,其索引操作看起来像这样:

def index
  @people = Person.find( :conditions => params[:search] )
end

Person 表中有一个 bool 值“is_admin”列。假设有些人是管理员,有些人不是,请调用 http://localhost:3000/people?search[is_admin]=true 应该用一些用户填充 @people ...当我在 development 模式下运行应用程序时,这对我的本地电脑来说是正确的..

但是......当我部署到我的服务器帐户(railsplayground)时,调用 http://mydomain.com/people?search[is_admin]=true 找不到任何匹配项。 但是,如果我将 ...?search[is_admin]=true 更改为 ...?search[is_admin]=1 响应会按预期返回管理员用户。 .

回到我的本地电脑上,使用“1”而不是“true”失败。

最重要的是

Person.find( :all, :conditions => { :is_admin => 'true' } )

在我的开发环境中工作,并且

Person.find( :all, :conditions => { :is_admin => 1 } )

在我部署的环境中工作。

这是为什么?我该如何解决?

理想情况下,我想放置如下链接:

link_to( "Administrators", {
  :controller => '/people',
  :action => :index,
  :search => { :is_admin => true }
})

并获取管理员列表 :)。

可能值得注意的是,我的开发数据库是一个 sqlite3 文件,而生产数据库是一个 mysql 数据库...

编辑:我理解对用户输入的反对意见,但在这种特殊情况下,这是一个非常非常小的威胁。此外,我当前的代码在我的开发电脑或我的生产帐户中都能完美运行,但不能同时在两者上运行。最简单的解决方案似乎改变了 sqlite3 保存和解释 bool 值的方式,所以我将我的问题改为“我如何改变 sqlite 保存 bool 值的方式”......如果 sqlite 能够完美地模仿 mysql 的行为,它将为我的发展服务完全需要...

最佳答案

问题是您将 bool 值作为字符串传递,最终行为取决于事件数据库。这里有更详细的解释。

当您读取 params[:search] 变量时,内容是一个字符串,没有类型。这是因为查询字符串无法理解是否

params[:search][:is_admin] = "true"

实际上是指

params[:search][:is_admin] = "true"
params[:search][:is_admin] = true

同样,当您通过 1 时,您最终得到

params[:search][:is_admin] = "1"

不同于

params[:search][:is_admin] = 1

当您将值传递给查询时,因为您没有传递 bool 值,数据库适配器不会转换该值。您的最终查询结果类似于

SELECT * FROM `persons` WHERE `persons.is_admin` = 'true'

SQLite3 将 bool 值存储为 t/f 字符串。 true 存储为 't'false 存储为 'f'。我想它也理解真/假,它会自动翻译你的查询。 相反,MySQL 只理解 0/1 和 true/false,它失败了。

当您切换行为,传递 1 而不是 true 时,您将导致 SQLite 失败,因为它无法转换字符串 "1"'。相反,MySQL 可以而且确实如此。

在这两种情况下,你都做错了。您不应传递字符串,而应传递 bool 值。此外,您永远不应该相信用户输入。

我的建议是在输入 Person.find 之前规范化您的 params[:search]

关于mysql - 为什么部署环境中的 Model.find 行为与开发环境中的不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2214367/

相关文章:

ruby-on-rails - 用于测试环境的 Rails 3 Rake 克隆数据库

php - 在mysql中将camelcase表和列名转换为snake case

ruby-on-rails - 无法使用带 Rails 的 PostgreSql 创建数据库

mysql - Spring和MySQL存储过程

php - 警告:mysql_fetch_assoc()期望参数1为资源,给定 bool 值

mysql - 从 MySQL 字段中删除字符串?

ruby-on-rails - 在 Rails 中对数字字符串进行排序

ruby - 升级 chefdk ruby​​ 版本

ruby - 如何在ubuntu中安装指定版本的Ruby

python - 无法在 OSX 中完成 mysql-python 安装