コードが機能しないのはなぜですか?
Project.where(:is_available?)
where メソッドでは、引数のハッシュまたは (SQL) 条件の文字列を渡す必要があります。ここでやろうとしていることは、メソッドが is_available? であるすべてのプロジェクトを選択することです? true を返します。問題は、メソッドis_available?
が Ruby メソッド (モデルで定義されている) であることです。Ruby の関数なので、SQL 内で呼び出すことはできません。where メソッドは、Ruby コードではなく、SQL 条件を想定しています。
(コメントの@benzadoに感謝します)
問題を解決するには:
これはあなたが探しているもので、db レベルでのみ計算されます:
Project.joins(:workers)
.select('projects.*')
.group('projects.id')
.having('COUNT(workers.*) > 2')
これにより、少なくとも 2 人のワーカーが関連付けられているすべてのプロジェクトが返されます。
これを改善するにはどうすればよいですか?
このクエリのスコープを作成して、どこでも簡単に使用できます。
#in your model
class Project < ActiveRecord::Base
scope :having_more_than_x_workers, lambda do |workers_count|
joins(:workers).select('projects.*').group('projects.id').having("COUNT(workers.*) > #{workers_count || 0}")
end
end
たとえば、コントローラーで使用するには:
#in your controller
def index
@projects = Project.having_more_than_x_workers(2)
end