これはばかげているかもしれませんが、プロジェクトに必要なすべてのモデルを表す gem を含めています。to_custom_string
これらのモデルの 1 つにメソッドを追加したいと思いPerson
ます。
私は(この例
に従って)これをやろうとしていました: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 を介してのみ発生したことです ( Person
gem のクラスで宣言されたすべての関連付けが失われます)。
私のレーキタスクは次のようなものでした:
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
宝石からapp/models
ディレクトリにコピーし、to_custom_string
そこにメソッドを配置することですが、これは間違っていることがわかっています。
Person
a) irb は私のアソシエーションを保持したが、rake は保持しなかった理由、および b) どうすれば rake に協力してもらうことができるのか、誰か説明してもらえますか?
ありがとうございました!