基本プライマー:has_many関係の実際のクラスは何ですか?
class User
has_many :programs, :through => :memberships
has_many :memberships
end
class Program
end
class Membership
belongs_to :user
belongs_to :program
end
コンソール:
User.new.save
Program.new.save
User.programs << Program.first
User.first.programs.class
# => Array
User.first.programs.methods.grep /where/
# => []
User.first.programs.where :id => 1
# => [#<Program id: 1>]
User.first.programs.where(:id => 1).class
# => ActiveRecord::Relation
そこで質問がUser.first.programs
、has_manyの方法は、ActiveRecord::Relation
のように樹皮やRelation
のようなメソッドを受け入れ、結果を返すように見えるということですが、自己識別はArray
とし、そのメソッドをクラスArray
のインスタンスと共有します。
だから何ですか?
確かに、Rails(とRubyについては問題ありません)の一部です。もちろん、フォローアップの問題は次のようなものです。ドキュメンテーションのために祈る以外に、この状況をどのように処理しますか?これについては、ここでそれほどの質問があります:http://stackoverflow.com/questions/5446331/metaprogramming-how-to-discover-the-real-class-of-an-object – Chinasaur
Rubyの暗い魔法はデザインによってもたらされ、それは大丈夫ですだから、私はこの種の問題を避ける最善の方法は単に "しないでください"と言います。私はチェックしませんでしたが、Rails 3ではこれとは別のやり方があると思います。 – tokland
ダークマジックが大丈夫だと知っている限り、私は同意します。しかし、それが起こったときには恐ろしく、十分に文書化されていないので、これらの状況を検出して作業するための信頼できる方法があればうれしいでしょう。本当のクラスを取得する方法が必要なような気がします。 – Chinasaur