【问题标题】:inflections dont work after update of activerecord更新活动记录后拐点不起作用
【发布时间】:2014-08-25 15:04:34
【问题描述】:

我已将活动记录从 3.2.12 更新到 4.1.4。因此,我也将 activesupport 从 3.2.12 更新到 4.1.4。现在,当我进行数据库查询(h2 数据库)时,我无法使用

 mrs = MeasurementResultSample.find_by_duration_and_measurement_result_id(duration, id)

我只能用

mrs = MeasurementResultSample.where(:duration => duration, :measurement_result_id => id).first

我已经从 1.2.9 升级到 1.3.9 的 activerecord-jdbch2-adapter

我怎样才能让使用一个或多个字段的“find_by”方法再次起作用?

感谢您的任何提示!

更新: 实际上事实证明, find_by 正在工作,但我必须检查该表是否存在,该方法是否存在?不起作用的是 find_last_by... 或 find_all_by... 或 find_first_by... 。

【问题讨论】:

    标签: ruby activerecord activesupport inflection


    【解决方案1】:

    据我了解,Rails 正在放弃某些“神奇”方法名称,因为它们所依据的“method_missing”性能不佳。

    但是,find_by 有效。因此,您可以使用以下方法重新处理您的查询:

    mrs = MeasurementResultSample.find_by(duration: duration, measurement_result_id:, id)
    

    有趣的是,幕后的实现是:

    def find_by(*args)
      where(*args).take
    end
    

    http://api.rubyonrails.org/classes/ActiveRecord/FinderMethods.html#method-i-find_by

    编辑:

    有一个 gem 包含 Rails 4 已弃用的查找器:

    https://github.com/rails/activerecord-deprecated_finders

    令人困惑的是,它声明 find_by... 方法并未被弃用。但是,如果您在 Rails 之外更新了 ActiveRecord,它可能会有所帮助。

    如果没有,您可以随时查看 Rails 3 ActiveRecord 代码并移植相关方法。

    【讨论】:

    • 来自原始海报的评论作为编辑离开:“感谢您的提示。但是我必须更改大约 100 个类,每个类有大约 10 到 20 个方法,以及大量的测试类。即使使用 sed 或 awk这需要我几天的时间。我宁愿通过覆盖适当的方法来扩展一些现有的类,或者还有其他方法吗?”
    【解决方案2】:

    感谢A Fader Darkly!我终于开始将代码移植到 activerecord 4.1.4。我选择将查找器方法更改为 where(...)。

    在这里我也找到了一些信息what-s-new-in-active-record-rails-4。 这是最干净的方式。我注意到,我必须使用存在?在某些情况下确保表不为零的方法。在使用屈折变化之前(在 3.2.12 中)我不必这样做。

    【讨论】:

      猜你喜欢
      • 2014-06-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多