【问题标题】:issues related find_by_sql in railsrails 中与 find_by_sql 相关的问题
【发布时间】:2016-07-14 06:15:10
【问题描述】:

我正在使用 Rails 4,我需要在我的活动记录模型中使用 find_by_sql。现在我面临两个严重的问题。第一个是它没有给我一个特定的数据是否给出#Employee:0x0000000b2a1718作为结果。我的模型名称是 Employee,tbale 名称是员工。我正在使用 pg。

请告诉我有什么解决办法。

第二个问题是如何在 find_by_sql 中使用的 sql 查询中编写任何 rails 变量。例如我想执行 find_by_sql("select firstname from employee where id=@var"),其中@var 是一个 ruby​​ 变量。

我需要执行的实际查询是 select firstname from employee where comapact_string like %@var% using find_by_sql.

【问题讨论】:

  • 我的第一个问题是为什么当您提供的示例不需要它时,您需要下拉到原始 SQL。
  • 不,这只是一个示例查询。我需要执行的实际查询是 select firstname from employee where firstname like %@var%..... 不知道如何实现这一点。
  • ActiveRecord 仍然可以轻松满足这一要求。
  • 你能告诉我怎么做吗?
  • 你可以这样使用,Employee.where("id LIKE '%?%'", @var).select(:firstname)

标签: sql ruby-on-rails ruby postgresql activerecord


【解决方案1】:

进行查询时有一定程度的自定义。最简单的形式是您可以使用内置查找器:

Employee.where(id: @var).pluck(:first name)

这将进行直接匹配,如果找到,则为您提供first_name 列值。 pluck不生产模型。

如果您想与LIKE 进行近似匹配,请更正式地写出WHERE 子句:

Employee.where('id LIKE ?', "%{@var}%").pluck(:first_name)

您很少需要使用find_by_sql 写出整个查询,但如果您这样做,您必须非常谨慎地在查询中输入哪些数据。强烈建议尽可能使用占位符值,如果您绝对必须绕过它,请转义所有内容,无论来源如何。

【讨论】:

  • 在我的代码中使用它后,我没有得到任何结果。当我看到服务器终端时,我发现 Employee.where('compact_string LIKE ?', "%{@var}%").pluck(:first_name).,,它没有显示结果,可能是因为@var在查询执行期间,值不会被实际值替换。
  • 什么是@var?你确定它设置正确吗?不要忘记实例变量对创建它们的上下文很敏感,因此控制器变量在模型代码中不起作用。查看您的查询日志以了解正在执行的内容:log/development.log
  • 是的,我用一个字符串启动它。它包含“snubpully500mm”
  • 如何在终端打印所有获取的记录。我的意思是我可以存储在变量中吗?
  • 我想使用 puts
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多