2013-07-11 51 views
0

我有我的事件管理應用程序一個UserEvent類,以及用戶事件可以在事件發生的許多事件日期:如何在Rails中查詢與關聯的模型?

class UserEvent < ActiveRecord::Base 
    ... 
    has_many :event_dates 
    ... 
end 

的EVENTDATE類有一個user_event_date屬性:

class EventDate < ActiveRecord::Base 
    attr_accessible :user_event_date, :start_time, :end_time 
    belongs_to :user_event, inverse_of: :event_dates 
    ... 
end 

我有一個搜索類,執行搜索時,find_user_events方法會過濾用戶事件,因此只有用戶事件保留其user_event_date位於搜索對象user_event_date_from和user_event_date_to屬性之間。

class Search < ActiveRecord::Base 
    attr_accessible :user_event_date_from, :user_event_date_to 

    private 
    def find_user_events 
     if user_event_date_from.present? || user_event_date_to.present? 
     time_range = user_event_date_from..user_event_date_to 
     user_events = UserEvent.joins(:event_dates).where(event_dates: {user_event_date: time_range}) 
    end 
end 

但過濾器不起作用,所有記錄都會返回。我是從這個這個「其中」守則「對連接表指定條件」一節的Rails指南:

Active Record Query Interface

所以我的問題:

  • 如何得到這個工作?
  • 如果用戶僅指定user_event_date_from(user_event_date_to將是nil)將這項工作,作爲該範圍將是從user_event_date_from爲nil,或者我應該檢測到並設置的範圍內:user_event_date_from..user_event_date_from

由於提前!

回答

0

應該不會太棘手調試..打開軌道控制檯,並堅持在

UserEvent.joins(:event_dates).where(event_dates: { user_event_date: 10.days.ago..DateTime.now }) 

,讓你知道你會得到一些數據返回..或更改日期。檢查數據是否正確。如果那有效,那麼你的問題就在別處。

至於你的其他問題,如果你嘗試在一個範圍內使用nil,你會得到ArgumentError: bad value for range。所以,是的,取決於你希望它的行爲方式,通常的解決方案是檢查零值,並將其替換爲適合你想要實現的行爲的東西。

編輯 - 奇怪的是,nil..nil的範圍內不會產生一個ArgumentError,這可能意味着你沒有成功設置的值。你如何設定user_event_date_fromuser_event_date_to的值?

+0

作爲搜索的一部分,它們被隱式傳遞。它們應該在那裏,正如函數過濾機制的其他部分所看到的那樣,它以類似的方式訪問其他搜索屬性:user_events = user_events.where(state_id:state_id)if state_id.present? user_events = user_events.where(postal_code:postal_code)if postal_code.present? –

+1

老兄再次..如何設置user_event_date_from和user_event_date_to的值? – beck03076

+0

我們無法爲您調試您的應用程序,因爲我們沒有您的應用程序。此外,您沒有回答我的任何調試建議。在'find_user_events'方法中,從'user_event_date_from'和'user_event_date_to'的值向後工作,我相信你會解決它。 –