gpt4 book ai didi

ruby-on-rails - Ruby on Rails Monkey 修补 Gem 的模型

转载 作者:行者123 更新时间:2023-12-03 16:06:17 25 4
gpt4 key购买 nike

这可能很愚蠢,但我包含了一个 gem,它代表了我的项目所需的所有模型。我想添加一个方法,to_custom_string到其中一个模型,Person .

我试图通过以下方式执行此操作(遵循 this 示例):config/initializers/extensions/person.rb
其中包含以下内容:

class Person < ActiveRecord::Base
def to_custom_string
address.street.to_s
end
end
Person gem 中的类有 has_one :address协会。

我遇到的问题是这个补丁似乎覆盖了 Person从 gem 中类,而不是修补它。疯狂的是,这种覆盖行为只能通过 rake 体验(所有在 gem 的 Person 类中声明的关联都丢失了)。

我的 rake 任务是这样的:
namespace :convert
task :all_persons => :environment do
Person.where(:param => value).includes(:address).find_in_batches(:batch_size => 2000) do |persons|
persons.each do |person|
puts person.to_custom_string
end
end
end
end

调用 bundle exec rake convert:all_persons给我:
Association named 'address' was not found; perhaps you misspelled it?

但是将 rake 任务中的代码复制并粘贴到 rails 控制台工作正常。

我目前的解决方案是复制 Person 的代码从 gem 到我的 app/models目录,并有我的 to_custom_string那里的方法,我知道这是错误的。

谁能解释一下为什么 a) irb 保留了我的 Person协会,但 rake 没有,和 b) 我如何才能让 rake 合作?

谢谢!

最佳答案

首先,我不会重新打开类(class),而是创建一个模块并将其包含到 Person 中。所以它看起来像这样

  module CustomString
def to_custom_string
address.street.to_s
end
end

Person.send(:include, CustomString)

此外,在运行初始化程序时,Person 模型似乎还不可用。如果仍然不起作用,您可能希望将其放入您的 application.rb 中。
  config.railties_order = [ModelEngine::Engine, :main_app, :all]

我猜它在 irb 而不是 rake 中起作用的原因是因为它们以不同的方式查找类。 Irb(我相信您通过运行 rails 控制台运行)一次加载所有类,因此它从引擎加载类,然后运行初始化程序,您已经定义了来自引擎的类。我猜(虽然我不确定)开发模式下的 Rake 使用常量的延迟加载。所以它不会在一开始就加载所有类,只有当它找到一个未定义的常量时。然后它开始寻找可以定义该常量的文件。由于您将一些 Person 放入初始化程序中,因此它根本不会查找引擎的模型,因为在它看到 Person 时它已经具有 Person 定义。这就是为什么包含模块而不是重新打开类可能会有所帮助 -> 它强制它将从引擎中查找 Person 常量。

关于ruby-on-rails - Ruby on Rails Monkey 修补 Gem 的模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11994672/

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