2011-09-15 6 views
1

私は、親オブジェクトから子オブジェクトへプログラムでトラバースした後、元のオブジェクトと同じではない親オブジェクトが戻ってくることに気付きました。例えばRails - ActiveRecord - オブジェクトとリレーションシップをどのように埋め込むのですか?

親クラス:Car

子供クラス:私は最近、新しい文字列フィールドを追加しましたので、私はこれに気づいたseats

puts(@car.to_s) => a memory address 

puts(@car.seats.first.car.to_s) => totally different address 

多くSeat

carが持っていますマイグレーションによってCarに、そしてtraversinでそれを読もうとすることによってgの関係は、座席から戻って、そのフィールドは常にゼロだった!しかし、スカホールドビューにフィールドを追加してデータベースをチェックすると、新しいフィールドと値がそこにあります。

すべての古いフィールドが利用可能であるため、これは奇妙です。それは新しいものだけではありません。それが価値あるものであれば、最後から2番目のフィールドも文字列です。

フードの下では何が起こっていますか?私は何をする必要がありますか?ありがとう!

答えて

0

親クラスと子クラスでは、Car has_many Seatsということになります。 ActiveRecordに、ある関係が他の関係と逆の関係にあることを伝えることができます。

だから、
class Car < ActiveRecord::Base 
    has_many :seats, :inverse_of => :car 
end 

class Seat < ActiveRecord::Base 
    belongs_to :car, :inverse_of => :seats 
end 

、Railsのドキュメントを引用する、そうすることはあなたにそのようなことをさせます:へのポインタのための

d = Dungeon.first 
t = d.traps.first 
d.level == t.dungeon.level # => true 
d.level = 10 
d.level == t.dungeon.level # => true 
+0

ありがとう:inverse_of、良い読書。残念ながら、実際には機能しませんでした。アドレスはもう少し一貫していますが、時にはまだ別のものを指していることがあります。本当に、最大の問題は、この1つのフィールドが、私が後ろを横切って消えることです...私はCarレコードを直接取り出すことができます。私も3.1/1.9.2にアップグレードしようとしました... – James

関連する問題