2014-05-14 51 views
0

我有一個類,事件,有一個領域starts_at說事件何時開始,在日期時間。 Rails的3.0版本這個類的看上去開始如下:如何編寫Rails 3的範圍在Rails 4格式

class Event < ActiveRecord::Base 
    scope :between, lambda {|start_time, end_time| 
    {:conditions => ["? < starts_at < ?", Event.format_date(start_time), Event.format_date(end_time)] } 
    } 

在事件控制器,時限內使用該索引的事件如下:

class EventsController < ApplicationController 
    # GET /events 
    # GET /events.json 
    def index 
    @events = Event.scoped 
    @events = Event.between(params['start'], params['end']) if (params['start'] && params['end']) 
    respond_to do |format| 
     format.html # index.html.erb 
     format.json { render :json => @events } 
    end 
    end 

我如何重寫Rails 4的lamda,尤其是「:condition =>」,以便將其範圍在開始和結束時間之間,如(相當直接的)原始lamda所示。我瞭解原始內容,但我無法考慮如何使用「where(...)」在兩次限制之間獲得時間,正如之前對條件所做的那樣。

此外,我現在在控制器中使用Event.scoped已棄用?

非常感謝。

+0

即使在Rails 3中也是舊式的語法... – sevenseacat

回答

1
# in model 
scope :between, ->(from, to) { 
    where(starts_at: (Event.format_date(from)..Event.format_date(to))) 
} 

# in controller 
@events = Event.all 
if params['start'] && params['end'] 
    @events = @events.between(params['start'], params['end']) 
end 
... 

請注意Mysql中的BETWEEN語法與原始查詢的含義略有不同。您的查詢爲<BETWEEN使用<=

+0

我正在使用Postgres。現在檢查它是否可行...謝謝。 – tentimes

+0

還應該在Postgres中工作,請參閱:http://www.postgresql.org/ docs/9.3/static/functions-comparison.html – spickermann

+0

這有效,但我可以問,如果控制器中的第一行不應該是「@events = Event.all」,因爲「scoped」現在已根據api棄用?這個想法(顯然)是Event.all返回一個activerelation對象,而不是實際獲取一個巨大的數組。這是我認爲我正在閱讀的指南中的內容,但不確定? – tentimes

0

這應該工作:

scope :between, lambda { |start_time, end_time| 
    where('? < starts_at AND starts_at < ?', Event.format_date(start_time), Event.format_date(end_time)) 
} 

而且順便說一句,這句法是Rails 3中也是有效的(推薦)。現在

Event.all相當於棄用Event.scoped - 即它返回ActiveRecord::Relation(而不是一個Array,像以前的)。

+0

其實他是要求'RAIL 4範圍(lambda)'我猜。 – Pavan

+0

@Pavan請解釋你的意思。 –

+0

「我如何重寫Rails 4的lamda,特別是」:condition =>「,以便在開始時間和結束時間之間進行區分,如(相當直接的)原始lamda中所示?」從OP的帖子我猜這樣。 – Pavan

1

使用其中

真正改變:到是非常簡單的條件。你在大多數情況下,需要的僅僅是改變:到方法的條件如下:

{:conditions => ["name = ?", custom_name]} 

where(name: custom_name) 

在其他情況下,你需要鏈,其中法已經通過軌道提供人:

{:conditions => ["name = ?", custom_name], :limit => 10} 

where(name: custom_name).limit(10) 

關於比較日期,導軌知道如何使用範圍...例如處理呢:

where(create_at: 2.days.ago..Time.now) 

或自己可以設置特定的命令數據庫。

關於型號範圍的

現在也沒用,因爲鐵軌使用延遲加載和方法等,其中,所有的,訂單等。是可鏈接。所以你不需要它。