gpt4 book ai didi

ruby-on-rails - 弃用警告 : Dangerous query method (method whose arguments are used as raw SQL) called with non-attribute argument(s)

转载 作者:数据小太阳 更新时间:2023-10-29 06:53:46 32 4
gpt4 key购买 nike

我将我的 Rails 5.1.4 应用更新到了 5.2.0。我的一个模型中有以下范围:

  scope :by_category, lambda { |category_slug|
category_ids = Category.find_by(slug: category_slug)&.subtree_ids
where(category_id: category_ids)
}

由于该范围,Rails 返回以下错误:

DEPRECATION WARNING: Dangerous query method (method whose arguments are used as raw SQL) called with non-attribute argument(s): "coalesce(\"categories\".\"ancestry\", '')". Non-attribute arguments will be disallowed in Rails 6.0. This method should not be called with user-provided values, such as request parameters or model attributes. Known-safe values can be passed by wrapping them in Arel.sql()

我该如何解决?

最佳答案

问题是 ordered_by_ancestry scope :

scope :ordered_by_ancestry, Proc.new { |order|
if %w(mysql mysql2 sqlite sqlite3 postgresql).include?(connection.adapter_name.downcase) && ActiveRecord::VERSION::MAJOR >= 5
reorder("coalesce(#{connection.quote_table_name(table_name)}.#{connection.quote_column_name(ancestry_column)}, '')", order)
else
reorder("(CASE WHEN #{connection.quote_table_name(table_name)}.#{connection.quote_column_name(ancestry_column)} IS NULL THEN 0 ELSE 1 END), #{connection.quote_table_name(table_name)}.#{connection.quote_column_name(ancestry_column)}", order)
end
}

正在将原始 SQL 字符串传递给 #reorder,正如警告所述,这在 Rails 5.2 中已弃用(并将在 Rails 6 中完全删除)。

A pull request刚刚提交通过将这些字符串包装在 Arel.sql 调用中来修复此问题。我希望它能快速合并(尽管拉取请求在第二个分支中缺少 Arel.sql 调用)但与此同时,您有一些选择:

  1. 忽略警告并等待 gem 被修补。

  2. fork gem,合并拉取请求,并使用您的 fork 版本,直到 gem 合并有问题的拉取请求。

  3. 手动替换 ordered_by_ancestry 范围:

    def self.ordered_by_ancestry(order)
    reorder(Arel.sql("coalesce(#{connection.quote_table_name(table_name)}.#{connection.quote_column_name(ancestry_column)}, '')"), order)
    end

    并等待合并请求。


更新:修复此警告的拉取请求是 just merged因此无需再等待,您应该能够从 GitHub 获取最新的信息并继续做更多有趣的事情。感谢kbrock用于解决这个问题。

关于ruby-on-rails - 弃用警告 : Dangerous query method (method whose arguments are used as raw SQL) called with non-attribute argument(s),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49887593/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com