2017-11-13 12 views
0

ユーザと産業の2つのテーブルがあります。ユーザーは多くの業界に関連し、多くのユーザーが1つの業界に属します。has_scopeを使用して多対多の表を持つオブジェクトをフィルタする

Industry.rb

class Industry <ApplicationRecord 
    has_many: users,: through =>: industry_users 
    has_many: industry_users 
end 

User.rb

class User <ApplicationRecord 

  belongs_to: specialty 
  has_many: industries,: through =>: industry_users 
  has_many: industry_users 

  scope: by_specialty, -> specialty {where (: specialty_id => specialty)} 
  scope: by_period, -> started_at, ended_at {where ("graduation_date> =? AND graduation_date <=?", started_at, ended_at)} 
end 

IndustryUser.rb

それらの間の関係はmany_to_manyです。 2つの列を格納する3番目の表IndustryUserがあります。

class IndustryUser <ApplicationRecord 
    belongs_to: user 
    belongs_to: industry 
end 

今私はAPIを開発しています。私はhas_scope gemを使用してgetリクエストのパラメータでユーザをフィルタリングします。上では、私は専門と卒業の日付でそれらをうまくフィルタリングしました。 たとえば、専門分野のフィルタリング。

http://localhost:3000/v1/users?by_specialty=1 

卒業の日付までにフィルタリングする。一定の期間を提供する必要があります。

http://localhost:3000/v1/users? 
by_period[started_at]=20040101&by_period[ended_at]=20070101 

特定の業界に属するユーザーを取得したいと思ったときに、私は立ち往生しました。 はここでGETクエリ例えば

http://localhost:3000/v1/users?by_industry=2 

の一例です。ここでは、第2業界に関連するすべてのユーザーを表示したいと考えています。 誰もhas_scopeを使って多対多リレーションに関連するオブジェクトをフィルタリングする方法を知っていますか?

答えて

0

私はが、のようなものになるだろうと思う

scope: by_industry, -> industry {User.joins(:industry_users).where(industry_users: {id: IndustryUser.where(industry: Industry.where(id: industry))})} 

このビットは正しい業界を見つける:

Industry.where(id: industry) 

このビットはちょうど-たIndustryを参照IndustryUserレコードを検索します:

IndustryUser.where(industry: Industry.where(id: industry)) 

そして、見つけたindustry_usersに参加してUserを見つけると、industry_usersの参照です。

User.joins(:industry_users).where(industry_users: {id: IndustryUser.where(industry: Industry.where(id: industry))}) 
+0

私があなたに提案した範囲を入れました。エラーがあります。 –

+0

エラーは? – jvillian

+0

"#

関連する問題