使用 has_scope 在 Rails 中过滤具有多对多 table 的对象
Filter objects with many-to-many table in Rails using has_scope
有两个 table:用户和行业。用户可以涉及多个行业,很多用户属于一个行业。
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
行业User.rb
他们之间的关系是many_to_many。
第三个 table 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 过滤与多对多关系相关的对象?
我认为会是这样的:
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
以查找 industry_users
引用的 User
。
User.joins(:industry_users).where(industry_users: {id: IndustryUser.where(industry: Industry.where(id: industry))})
有两个 table:用户和行业。用户可以涉及多个行业,很多用户属于一个行业。
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
行业User.rb
他们之间的关系是many_to_many。 第三个 table 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 过滤与多对多关系相关的对象?
我认为会是这样的:
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
以查找 industry_users
引用的 User
。
User.joins(:industry_users).where(industry_users: {id: IndustryUser.where(industry: Industry.where(id: industry))})