2016-11-19 50 views
-1

我完全困惑于如何编写一个范围,该范围显示已关闭或已过期的事件 。如果一个人能告诉我,我 将不胜感激如何编写封闭或过期对象的范围 - Rails 4

模式

ActiveRecord::Schema.define(version: 20161116132520) do 
    create_table "events", force: :cascade do |t| 
    t.string "title" 
    t.text  "description" 
    t.date  "date" 
    t.string "city" 
    t.boolean "close" 
    t.integer "user_id" 
    end 
end 

我想下面的范围,但没有运气:

Event.rb file 

scope :expired_or_closed_events, -> {where(['close = ?', true] || ['date < ?', Date.current])} 

scope :expired_events, -> {where(['date < ?', Date.current])} 
scope :closed_events, -> {where(['close = ?', true])} 

问题:这是下面的问题我有。范围 events.expired_or_closed_events.countevents.closed_events.expired_events.count应该显示共 计数5。难道一个好心劝我,我怎么写一个范围,多数民众赞成 显示是closed but not expired & that are closed and expired

所有事件 -

2.3.0 :002 > events.count 
    (0.2ms) SELECT COUNT(*) FROM "events" 
=> 8 
2.3.0 :003 > 
2.3.0 :004 > 
2.3.0 :005 > events.closed_events.count 
    (0.2ms) SELECT COUNT(*) FROM "events" WHERE (close = 't') 
=> 1 
2.3.0 :006 > 
2.3.0 :007 > 
2.3.0 :008 > events.expired_events.count 
    (0.3ms) SELECT COUNT(*) FROM "events" WHERE (date < '2016-11-19') 
=> 4 
2.3.0 :009 > 
2.3.0 :010 > 
2.3.0 :011 > 
2.3.0 :012 > events.expired_or_closed_events.count 
    (0.2ms) SELECT COUNT(*) FROM "events" WHERE (close = 't') 
=> 1 
2.3.0 :013 > 
2.3.0 :014 > 
2.3.0 :015 > 
2.3.0 :016 > events.closed_events.expired_events.count 
    (0.2ms) SELECT COUNT(*) FROM "events" WHERE (close = 't') AND (date < '2016-11-19') 
=> 0 
2.3.0 :017 > 

回答

1

你可以试试混合红宝石用SQL方式:

scope :expired_or_closed_events, -> { where('close = ? OR date < ?', true, Date.current) } 

scope :expired_events, -> { where('date < ?', Date.current) } 
scope :closed_events, -> { where(close: true) } 
1

你可以尝试像以下:

scope :expired_or_closed_events, -> {where("close = 't' or date < '#{Date.current}'")}