【问题标题】:Rails custom model method in where queryRails 自定义模型方法在 where 查询
【发布时间】:2016-09-11 05:10:13
【问题描述】:

在我的 rails 应用程序中,我在 Kid 模型中定义了基于 Kids DB 中的字段的计算。方法如下:

def flip_date 
  self.dob.advance(months: 10) 
end

我想在我的控制器中使用它,因为我有一个方法,我定义如下:

new_kids = Kid.where(discharge_date: nil).where('flip_date > ?', Date.current.advance(year: 1).beginning_of_year)

但是我不断收到以下错误:

SQLite3::SQLException: no such column: flip_date: SELECT "kids".* FROM "kids" WHERE "kids"."discharge_date" IS NULL AND (flip_date < '2017-01-01')

关于如何完成这项工作的任何想法?感谢所有帮助!

【问题讨论】:

  • 我认为您将不得不使用scope,请参阅documentation 中的语法和示例
  • @ImranAli 我查看了文档,但我仍然认为它不会解决问题,因为仍然有一个查询发生在 scope 定义中,但 flip_date 不是列
  • @AlvinLau 你想通过哪里查询来实现什么? where 方法将创建 SQL 语句,您将无法在 sql 中使用模型方法。

标签: ruby-on-rails activerecord activemodel


【解决方案1】:

如果您真的想使用模型方法,请查看http://apidock.com/rails/v4.0.2/ActiveRecord/QueryMethods/select

对于您的情况:

new_kids = Kid.where(discharge_date: nil).select{|k| k.flip_date > Date.current.advance(year: 1).beginning_of_year}

但是 select 方法会在返回最终结果之前获取内存中的每个对象。因此,我建议使用普通的 where 子句,而不是 flip_date 考虑 dob(这是数据库中的一列)。

这样

new_kids = Kid.where(discharge_date: nil).where('dob > ?', <date criteria>)

【讨论】:

  • 正是我要找的,选择命令。谢谢!
  • 选择返回数组。如何获取 ActiveRecord_Relation 而不是 Array?
  • @hobbydev 我正在寻找相同的。您是否在“如何获取 ActiveRecord_Relation 而不是 Array?”中找到任何内容? ?
【解决方案2】:

如果您可以接受返回是一个数组,那么 select 方法 (http://apidock.com/rails/v4.0.2/ActiveRecord/QueryMethods/select) 非常有用。

我仍在寻找一种通过 ActiveRecord_Relation 返回的方法。

如果其他人知道如何做到这一点,如果你能分享,将不胜感激。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-09
    • 1970-01-01
    • 1970-01-01
    • 2018-09-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多