Rails作用域方法返回WhereChain而不是数组

时间:2019-01-27 19:33:36

标签: ruby-on-rails

在我的Deal类中,我添加了一个范围方法:

scope :current, -> { where {|d| d.end_date > Date.today} }

它返回正确的数据,但是它返回一个ActiveRecord::QueryMethods::WhereChain,而不是返回一个我可以计数,迭代的数组,而我对此无能为力。

我注意到对Deal.current的呼叫以“ @scope=”开头:

Deal.current                                                                                                                   
  Deal Load (1.0ms)  SELECT "deals".* FROM "deals"
=> #<ActiveRecord::QueryMethods::WhereChain:0x00007fbc61228038
 @scope=
  [#<Deal:0x00007fbc5fdb2400
    id: 7,

我想如果我知道如何使用诸如where之类的“正常” where(end_date>Date.today)语句进行比较(而不是相等),这会帮我解决问题,因为范围方法使用了简单的方法where之类的scope :posted, -> { where.not(posted_date:nil) }语句返回一个正常可用的ActiveRecord.Relation,但是我确实想弄清楚如何正确地使用更复杂的查询。

1 个答案:

答案 0 :(得分:5)

您可以使用以下方式:

scope :current, -> { where('end_date > ?', Date.today) }

Rails中不存在where调用的块语法。

您还可以查看arelhttps://robots.thoughtbot.com/using-arel-to-compose-sql-queries);

deal = Deal.arel_table
Deal.where(deal[:end_date].gt(Date.today))