我有2个表“existing_practices”& “latest_practices”,都包含一个列“practice_id”
我想要做的是将latest_practices与existing_practices进行比较,以找出我在existing_practices上没有的latest_practices表上的哪些做法(换句话说,我需要找到新的做法)
示例:
existing_practices latest_practices
------------------ ------------------
practice_id practice_id
A123 A123
B123 B123
C123 C123
D123
所以考虑到上面的2个表,我需要确定“D123”是一种新的做法。
我尝试了以下但是它似乎不起作用:
existing_practices = ExistingPractice.select(:practice_id).all
latest_practices = LatestPractice.select(:practice_id).all
new_practices = latest_practices.to_a - existing_practices.to_a
我认为最简单的方法是编写原始sql但我想以rails方式(如果有的话)这样做。
有人可以帮忙吗?
答案 0 :(得分:2)
pluck 用于将列值作为数组
获取new_practices = LatestPractice.pluck(:practice_id) - ExistingPractice.pluck(:practice_id)
答案 1 :(得分:0)
如果您有大量数据,采摘practice_id
并减去它们的解决方案效果不佳。相反,我建议:
<强> Okish:强>
LatestPractice.where.not(practice_id: ExistingPractice.select(:practice_id).map(&:practice_id))
更好:
LatestPractice.where.not("EXISTS(SELECT 1 from existing_practices where latest_practices.practice_id = existing_practices.practice_id)")
更好:
LatestPractice.where('practice_id NOT IN(SELECT DISTINCT(practice_id) FROM existing_practices)')
答案 2 :(得分:0)
您可以直接使用sql以获得更好的性能。
new_practices_id = ActiveRecord::Base.connection.execute("SELECT DISTINCT latest_practices.practice_id FROM latest_practices LEFT JOIN existing_practices ON latest_practices.practice_id =
existing_practices.practice_id WHERE existing_practices.practice_id IS NULL")
这将返回practice_id
表中不存在的existing_practices
数组。
这是小提琴示例company two columns or tables
你可以使用pluck
new_practices = LatestPractice.pluck(:practice_id) - ExistingPractice.pluck(:practice_id)