2015-07-06 2 views
1

Я хочу захватить те Blogs, где находится его title.present? == true. (Blogs имеют строковый атрибут title).ActiveRecord: область применения атрибута

class Blog < ActiveRecord::Base 
    scope :with_present_titles, -> {where("#{title.present?} == ?", true)} #doesn't work 
end 

@blogs = Blog.with_present_titles #doesn't work 

Не уверен, что я делаю неправильно здесь.

+2

Ваш столбец базы данных является 'title', не так ли? Вероятно, ваше определение области должно быть '{where (" title is not null and title! = '' ")}', Который возвращает все блоги с непустым и не нулевым заголовком. – vee

+0

@vee работает! Пожалуйста, отправьте ответ, чтобы я мог дать вам кредит. – Neil

ответ

3

Чтобы вернуть все записи с некоторыми значениями в title колонки, вы бы обновить сферу с помощью следующего запроса:

scope :with_present_titles, -> { where("title is not null and title != ''") } 

Это возвращает все записи с некоторым значением в заголовке столбце оставляя null и пустых названий.

.present?, являющийся методом, предоставляемым рельсами, вы не можете просто использовать эти методы в своих запросах БД.

1

Просто напишите следующую область.

scope :with_present_titles, -> { where('title IS NOT ? AND TITLE != ?', nil, '') } 
1

В зависимости от ваших рельсов версии вы также можете использовать where.not (введен в рельсах 4), например,

scope :with_present_titles, ->{where.not(title: [nil,'']) } 
#Blog.with_present_titles.to_sql 
#=> "SELECT [blogs].* 
# FROM [blogs] 
# WHERE (NOT (([blogs].[title] = '' OR [blogs].[title] IS NULL)))" 
Смежные вопросы