あなたは両方のための明示的なスコープを持つことができ、またはptypeに基づいて選択する1つのスコープを持つことも、データベース内の各固有のptypeのスコープをメタプログラムすることもできます。
ProjectType.ptype('web')
または
:と呼ば
scope :ptype, -> (ptype) { where(ptype: ptype) }
:あなたは異なる「のptype」の様々なを追加する場合、あなたはどんな「のptype」を処理するためにあなたの範囲を与える、次のいずれかを行うことができます
class ProjectType < ActiveRecord::Base
self.pluck(:ptype).each do |ptype|
scope ptype.gsub(/\s+/,"_").downcase.to_sym, -> { where(ptype: ptype) }
end
end
私はこれをお勧めしません。また、各 "文字列"(例:ProjectType.webまたはProjectType.mobile)には個別スコープを推奨しません。最良のバランスは、あなたが探しているものを取得するスコープに文字列値を渡すことです。私の意見では、他の人が違う気持ちでいると確信しています。
正直言って、ptypeフィールドは列挙子にとって熟していると思います。これは、コードに明快さを与え、ランダムに任意の文字列を配置するのではなく、そのフィールドが実際に期待するものを定義します。だから、のようなもの:
class ProjectType < ActiveRecord::Base
enum ptype: [:web, :mobile]
scope :ptype, -> (ptype) { where(ptype: self.ptypes[ptype] }
end
などのように呼ばれる:
ProjectType.ptype(:web)
は、私は、メタプログラミングソリューションを除いて、これらのソリューションのいずれかが任意のより多くの「権利」をここに提示以上であるとは思いませんこれは、データベースに格納されているptypeフィールドの各文字列のスコープを生成しています。
最後に、ここにあなたのポートフォリオのためのスコープです:
class Portfolio < ActiveRecord::Base
scope :by_ptype, -> (ptype) { joins(:project_type).merge(ProjectType.ptype(ptype) }
end
そしてそうのように呼ばれる:
Portfolio.by_ptype(:web)
「scope:web、 - > {ここで(ptype: 'web')} 'と似ていますか? – Stefan
@StefanポートフォリオではなくprojectTypesのリストを返します – MaruniakS