gpt4 book ai didi

ruby-on-rails - 扩展 ActiveRecord::Base

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

我正在尝试向 ActiveRecord 添加一些自定义方法。我想为模型的每个 date 字段添加一个 *_after*_before 范围,这样我就可以做这样的事情:

User.created_at_after(DateTime.now - 3.days).created_at_before(DateTime.now)

我遵循了这里解释的解决方案 Rails extending ActiveRecord::Base但是当我执行 Rails 控制台并尝试调用方法时,我得到了一个undefined method 错误。

这是我的代码:

# config/initializers/active_record_date_extension.rb
require "active_record_date_extension"

# lib/active_record_date_extension.rb
module ActiveRecordDateExtension
extend ActiveSupport::Concern

included do |base|
base.columns_hash.each do |column_name,column|
if ["datetime","date"].include? column.type
base.define_method("#{column_name}_after") do |date|
where("#{column_name} > ?", date)
end
base.define_method("#{column_name}_before") do |date|
where("#{column_name} < ?", date)
end
end
end
end
end
Rails.application.eager_load!

ActiveRecord::Base.descendants.each do |model|
model.send(:include, ActiveRecordDateExtension)
end

我做错了什么?

最佳答案

使用 Rails 4.1.9 和 Ruby 2.2.1,我注意到上面的代码存在一些问题。

  1. 您正在将 column.type 与字符串进行比较,Rails 返回该属性的符号。
  2. base.define_method 正在尝试调用私有(private)方法,您可以使用 send
  3. 绕过它

这是调整后的代码

module ActiveRecordDateExtension
extend ActiveSupport::Concern

included do |base|
base.columns_hash.each do |column_name,column|
if [:datetime, :date].include? column.type
base.class.send(:define_method, "#{column_name}_after") do |date|
where("#{column_name} > ?", date)
end
base.class.send(:define_method, "#{column_name}_before") do |date|
where("#{column_name} < ?", date)
end
end
end
end
end

关于ruby-on-rails - 扩展 ActiveRecord::Base,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32125234/

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