Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 在where中使用引用属性的Rails查询_Mysql_Sql_Ruby On Rails_Sqlite - Fatal编程技术网

Mysql 在where中使用引用属性的Rails查询

Mysql 在where中使用引用属性的Rails查询,mysql,sql,ruby-on-rails,sqlite,Mysql,Sql,Ruby On Rails,Sqlite,模型用户示例: 创建表用户 t、 字符串名 t、 布尔管理员 t、 布尔内部 结束 需要在SQL查询的where子句中使用admin或internal进行查询。在编写查询时,不知道将使用哪个布尔值,因此使用一个变量(比如usertype)来存储字符串admin或internal。这基本上意味着我想在where子句中使用一个被引用的属性 执行以下查询: User.selectid.where{usertype}='t' 在我的开发sqlite数据库中运行良好,因为sqlite将true存储为't'

模型用户示例:

创建表用户 t、 字符串名 t、 布尔管理员 t、 布尔内部 结束

需要在SQL查询的where子句中使用admin或internal进行查询。在编写查询时,不知道将使用哪个布尔值,因此使用一个变量(比如usertype)来存储字符串admin或internal。这基本上意味着我想在where子句中使用一个被引用的属性

执行以下查询:

User.selectid.where{usertype}='t'

在我的开发sqlite数据库中运行良好,因为sqlite将true存储为't',将false存储为'f',但我猜在另一个数据库Mysql或Postrgres(例如)上使用相同的查询可能不起作用

或者我试过了

User.selectid.where{usertype}=?,true

它也可以工作,并且不使用特定于sqlite的“t”。然而,这是一个好的、独立于数据库的解决方案吗?

您应该始终使用true或false或变量或代码来计算'truthy'或'falsy',并让rails处理转换,无论您的DBMS如何存储布尔值

在第二个示例中,您是这样做的

User.select("id").where("#{usertype} = ?", true)
因此,答案是肯定的,这是一个很好的、独立于数据库的解决方案。但是,您可以使它更整洁一些:如果您的所有条件都是=变化的,那么您可以使用散列,如

{:foo => "bar"}
{"foo" => "bar"} 
两者都相当于

["foo = ?", "bar"]
@foo.send("bar") == 123
这意味着在您的情况下,您可以省去字符串求值,只需传入变量即可

User.select("id").where({usertype => true})
或者,如果要跳过可选的{&}

编辑:回复关于在ruby代码中使用动态定义的方法从对象获取值的评论

您可以使用send方法对对象调用适当的访问器。比如说,

@foo.bar == 123
相当于

["foo = ?", "bar"]
@foo.send("bar") == 123
在你的例子中,你会说

a.send(usertype)
作为旁注,如果您想设置usertype的值,我认为这在您的情况下没有意义,但只是一个示例,那么您需要调用方法的setter版本,它可以是admin=或internal=。因此,在这种情况下,您需要使用字符串求值:

@user.send("#{usertype}=", "foo")
这就像说

@user.admin = "foo"


谢谢你的及时回复。我不熟悉ruby和rails,仍然处于学习曲线的底部……现在,如果我在找到记录后,将真理检查从where子句转移到一个单独的测试,比如a=User.findid,然后是a.admin或a.internal,那么在这种情况下我如何使用usertype变量?