在rails 4模型中正确使用Scope

时间:2014-09-08 11:44:18

标签: ruby-on-rails ruby-on-rails-4 activerecord scope

我使用范围来获取随机横幅,我使用了gem Randumb

scope :sidebar_top, -> { where(ad_type_id: 2).order_by_rand.first }

如果未找到广告,则返回所有行。根据Randumb文档,在没有找到任何内容的情况下它应该返回nil。

我应该首先使用范围来返回单个实例吗?这似乎是最好的方式,但我很少看到范围示例返回的不到一小部分。

如果找不到任何内容,我会如何回复nil?

由于

2 个答案:

答案 0 :(得分:0)

这样的东西?类方法而不是范围。

def self.sidebar_top
  where(ad_type_id: 2).blank? ? nil : where(ad_type_id: 2).order_by_rand.first
end

答案 1 :(得分:0)

您不应该使用范围来返回单个实例。观察[1]

至于答案:

def self.sidebar_top
  Array(where(ad_type_id: 2).order_by_rand).first # single query
end

[1]范围期望范围返回:如果proc返回nil或false,则返回范围。

scope :this_or_all, ->(feeling) { where(state: feeling) if feeling.present? }

因此,您可以执行此操作User.this_or_all(nil).this_or_all(happy)