2016-04-16 4 views
1

私のクエリにフィルタをかけるためにモデルのスコープを使用しています。私はのcompany_idに日付で比較するレールコントローラ

scope :company_id, -> (company_id) { where company_id: company_id } 

に属するすべてのxの労働者をフィルタリングしています。しかし、今、私は、より複雑なクエリを作っています。このような

何か。例えば、モデル「ワーカー」があり、最新の5日間からcompany_idに割り当てられたワーカーにクエリを実行したいとします。

scope :latest, -> (created_at) { where created_at: >= Time.now - 5.day} 

@company = Company.find(params[:id]) 
@workers = Worker.company_id(@company.id).latest(??) 

の最新フィルタの構文やPARAMTER次のようになります。

は、だから私のモデルでは、私は、このフィルタースコープを作成しましたか?空のままにしておくと、構文エラーが発生します。

+1

を行うことができますように**私は**最新の5日から 'company_id'に割り当てられている労働者を照会する - 労働者は'持った人が存在するどのような場合には123 'をcompany_idに入力して2日前に値を検索したいcompany_idに変更しましたか? – dp7

+0

mmmまた、updated_atを確認してください。それはとにかく完璧ではありません、私はRoRを学んでいるだけでクエリを遊んでいます:) – lapinkoira

答えて

1

2つの注釈:このような複雑なクエリ条件はシンボルを使用して記述することはできません。代わりに文字列表記を使用する必要があります。また、スコープにはパラメータが必要ないため、データベースcreated_at時間と現在の時間を5日間シフトして比較するだけで、latestスコープのスコープの1つです。だから、正しいスコープのようなものでなければなりません:

scope :latest, -> { where("created_at >= ?", Time.now - 5.days) } 

、あなたは単にそれを呼び出す:

@workers = Worker.company_id(@company.id).latest 
-2

を私が正しく理解していれば、あなたはそのスコープに引数を渡す必要はありません。

scope :latest, -> { where created_at: >= Time.now - 5.day} 
1

最新スコープは、パラメータを必要としません。以下は動作するはずです。

scope :latest, -> { where("created_at >= ?", Time.now - 5.days)} 

あなただけ

@workers = Worker.company_id(@company.id).latest 
+0

ありがとう!それだけです、パラメータなしで試したとき、私はまた、比較に構文エラーがありました – lapinkoira