2014-09-08 2 views
0

Я использую возможности для извлечения случайного баннера, я использую камень RandumbПравильно используя Scope в рельсах 4 модели

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

Когда нет объявления не найдено, все строки возвращаются. Согласно документам Randumb, он должен возвращать нуль в случае, если ничего не найдено.

Должен ли я использовать область видимости для возврата одного экземпляра в первую очередь? Кажется, это лучший способ, но я редко вижу примеры областей, возвращающих меньше, чем небольшое подмножество.

Любые идеи, как я могу вернуть нуль, если ничего не найдено?

Thanks

ответ

0

Что-то вроде этого? Метод класса вместо области видимости.

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

Спасибо большое! это также позволяет мне продлить его в будущем. –

0

Вы не должны использовать область действия для возврата одного экземпляра. Заметим, [1]

и в ответ:

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

[1] сфера ожидает возвращения области видимости: Если возвращается Учеб NIL или ложным, область вместо этого возвращается.

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

Следовательно, вы можете сделать это User.this_or_all(nil).this_or_all(happy).

Смежные вопросы