简体   繁体   English

ransack匹配所有协会

[英]ransack match all associations

I have User model, has_many skills. 我有User模型, has_many技能。 I need to get users match all the selected skills. 我需要让用户匹配所有选定的技能。 For example: 例如:

User A: Ruby, HTML, JavaScript. 
User B: Ruby
User C: Ruby, C++

When I search using the list of skills names or ids. 当我使用技能名称或ID列表进行搜索时。 I need get users have all values in this list. 我需要让用户拥有此列表中的所有值。 So, Search using Ruby & Javascript , I need to get User A . 所以,使用Ruby & Javascript搜索,我需要获得User A

The Problem if I used ransack gem skills_id_in , It'll return all users have Ruby Skill. 问题如果我使用skills_id_in gem skills_id_in ,它将返回所有用户都有Ruby Skill。 The Query is as the following: 查询如下:

SELECT \"users\".* FROM \"users\" LEFT OUTER JOIN \"user_skills\" ON \"user_skills\".\"user_id\" = \"users\".\"id\" LEFT OUTER JOIN \"skills\" ON \"skills\".\"id\" = \"user_skills\".\"skill_id\" WHERE \"skills\".\"id\" IN (1, 3)

If it's not allowed in ransack. 如果不允许在洗劫中。 Can you help How make it in ActiveRecord & run in DB level ? 你能帮忙吗? 在ActiveRecord中如何制作它并在数据库级别运行

My Opinion: It's can't implement using ransack params , If you know Native Query to match all association, let me know? 我的观点:使用ransack params无法实现,如果你知道Native Query匹配所有关联,请告诉我?

I can't seem to find a way to query a CONTAINS directly through Postgres, but the following would work: 我似乎找不到通过Postgres直接查询CONTAINS的方法,但以下方法可行:

result = User.joins(:skills)

skills_names = ['Ruby', 'JavaScript']
skills_names.each do |skill_name|
  result = result.where('? = ANY(name)', skill_name)
end

If you know how many skills you're going to be querying ahead of time, you could combine them all into one query: 如果您知道要提前查询的技能数量,可以将它们全部合并到一个查询中:

User.joins(:skills).where('? = ANY(name) AND ? = ANY(name)', 'Ruby', 'JavaScript')

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM