2016-11-11 84 views
0

我想對模型的方法執行where()查詢。我如何做到這一點?Ruby on rails where()用方法

如果我做不到,有什麼辦法,我可以做到這一點:

Session.find_each.select do |session| 
    session.end_date > params[:date_from].to_date && session.end_date < params[:date_to].to_date 
end 

但不是返回數組的ActiveRecordRelation?

session.rb

class Session < ActiveRecord::Base 
    belongs_to :course 
    delegate :units, to: :course 

    def end_date 
    start_date + units.count.weeks 
    end 
end 

end_date是方法,但start_date是一個字段。

+1

嘗試使用範圍在模型中看到:http://api.rubyonrails.org/classes/ActiveRecord/Scoping/Named/ClassMethods.html和http://guides.rubyonrails.org/active_record_querying.html#scopes –

+0

我不明白這可以幫助我。 –

+0

'嘗試這個,這會給你那些end_date介於date_from到date_to之間的會話,這個session_where(「end_date>?和end_date <?」,params [:date_from] .to_date,params [:date_to] .to_date)您還可以通過賦予符號分配來優化此查詢。 –

回答

1

可以,但你必須使用joins

units屬於當然,所以你必須申請where之前加入courses表。否則,您將獲取所有會話,並根據end_date逐個篩選,這將生成大量的sql查詢。

Session.joins(:course).where("calculate_end_date() > ? AND calculated_end_date() < ?", date, date) 

你需要calculate end date使用SQL函數,google一下