使用has_scope在Rails中使用多对多表过滤对象

时间:2017-11-13 18:25:22

标签: ruby-on-rails ruby 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

他们之间的关系很多很多。 还有第三个表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

当我想要获得属于特定行业的用户时,我陷入困境。 以下是获取查询的示例

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

例如。在这里,我希望它能够呈现与第二个行业相关的所有用户。 有没有人知道如何使用has_scope过滤与多对多关系相关的对象?

1 个答案:

答案 0 :(得分:1)

认为它会像:

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

这一位找到了正确的行业:

Industry.where(id: industry)

此位找到引用刚刚找到的IndustryUser

Industry条记录
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))})