【问题标题】:Comparing 2 tables in rails 5比较 Rails 5 中的 2 个表
【发布时间】:2017-09-20 12:45:04
【问题描述】:

我有 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 方式(如果有的话)。

谁能帮忙?

【问题讨论】:

    标签: sql ruby-on-rails ruby activerecord ruby-on-rails-5


    【解决方案1】:

    pluck 用于获取列值作为数组

    new_practices = LatestPractice.pluck(:practice_id) - ExistingPractice.pluck(:practice_id)
    

    【讨论】:

      【解决方案2】:

      如果您有大量数据,则提取practice_id 并减去它们的解决方案效果不佳。相反,我建议:

      还好:

      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)')
      

      【讨论】:

        【解决方案3】:

        您可以直接使用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)
        

        【讨论】:

        • 我说这更像是 ruby​​ 方式,但我不会将该代码提交到生产环境中。
        • @radubogdan 他只在 Rails 方式询问。顺便说一句,您正在获取表格行,但他将 id 作为数组询问。首先正确阅读问题
        • @krishnar 首先,他唯一的问题是Can anyone help?。其次,他只是展示他做了什么,这并不意味着你需要遵循它。第三,这个解决方案对 M 条记录表现不佳。干杯。
        • @krishnar 他正在尝试减去 ActiveRecords 数组,显然他希望得到一个关系或 ActiveRecords 数组:)
        • @radubogdan 这只是一个不同的答案,没有人说它更好,您的解决方案可能会更好,但这并不意味着它是唯一的解决方案。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-06-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-09-26
        相关资源
        最近更新 更多