has_many: durchgehend, selbst verweis Verein
-
20-09-2019 - |
Frage
Ich habe Probleme mit dem Selbstbezug Verein sollten die Modelle ma eine Reihe von Modellen für die left_chunks und right_chunks Methoden geben, aber ich bekomme jedes Mal ein leeres Array
Die Quelle
class Chunk < ActiveRecord::Base
has_many :left_bindings, :foreign_key => "left_chunk_id",
:class_name => "ChunkChunk",
:dependent => :destroy
has_many :right_chunks, :through => :left_bindings
has_many :right_bindings, :foreign_key => "right_chunk_id",
:class_name => "ChunkChunk",
:dependent => :destroy
has_many :left_chunks, :through => :right_bindings
end
class ChunkChunk < ActiveRecord::Base
belongs_to :left_chunk, :class_name => "Chunk", :foreign_key => "left_chunk_id"
belongs_to :right_chunk, :class_name => "Chunk", :foreign_key => "right_chunk_id"
end
Die Ausgabe von ./script/console
>> #first case
?>
?> left = Chunk.new({:content => "chunk_one"}); left.save
=> true
>> right = Chunk.new({:content => "chunk_two"}); right.save
=> true
>> left.right_chunks << right
=> []
>> left.right_chunks
=> []
>> left.left_chunks
=> []
>>
?> #second case
?>
?> left = Chunk.new({:content => "chunk_three"}); left.save
=> true
>> right = Chunk.new({:content => "chunk_four"}); right.save
=> true
>> right.left_chunks << left
=> []
>> right.left_chunks
=> []
>> right.right_chunks
=> []
Warum sind die Stücke nicht miteinander verbunden?
Datenbank nach Ausführung von Code
mysql> select * from chunks;
+----+-------------+---------------------+---------------------+
| id | content | created_at | updated_at |
+----+-------------+---------------------+---------------------+
| 1 | chunk_one | 2010-02-14 12:11:22 | 2010-02-14 12:11:22 |
| 2 | chunk_two | 2010-02-14 12:11:22 | 2010-02-14 12:11:22 |
| 3 | chunk_three | 2010-02-14 12:11:22 | 2010-02-14 12:11:22 |
| 4 | chunk_four | 2010-02-14 12:11:22 | 2010-02-14 12:11:22 |
+----+-------------+---------------------+---------------------+
mysql> select * from chunk_chunks;
+----+---------------+----------------+---------------------+---------------------+
| id | left_chunk_id | right_chunk_id | created_at | updated_at |
+----+---------------+----------------+---------------------+---------------------+
| 1 | NULL | 2 | 2010-02-14 12:11:22 | 2010-02-14 12:11:22 |
| 2 | 3 | NULL | 2010-02-14 12:11:22 | 2010-02-14 12:11:22 |
+----+---------------+----------------+---------------------+---------------------+
Irgendwelche Ideen?
Lösung
Sie sagen nicht, welche Version von MySQL, Rubin oder Rails sind Sie an. Ich habe gerade versucht, dies mit einer kleinen Testanwendung und es funktionierte richtig. Ich verwende PostgreSQL 8.4.1 auf OS X 10.6. Ich habe gerade eine leere app on Rails erstellt 2.3.5 / 1.8.7 Rubin (2009-06-12 Patchlevel 174) mit "Schienen testapp", dann noch zwei Modelle in chunk.rb:
class Chunk < ActiveRecord::Base
has_many :left_bindings, :foreign_key => "left_chunk_id",
:class_name => "ChunkChunk",
:dependent => :destroy
has_many :right_chunks, :through => :left_bindings
has_many :right_bindings, :foreign_key => "right_chunk_id",
:class_name => "ChunkChunk",
:dependent => :destroy
has_many :left_chunks, :through => :right_bindings
end
... und chunk_chunks.rb:
class ChunkChunk < ActiveRecord::Base
belongs_to :left_chunk, :class_name => "Chunk", :foreign_key => "left_chunk_id"
belongs_to :right_chunk, :class_name => "Chunk", :foreign_key => "right_chunk_id"
end
... plus zwei Migrationen die Tabellen hinzufügen, ohne Zeitstempel der Kürze halber:
class AddChunks < ActiveRecord::Migration
def self.up
create_table 'chunks' do | t |
t.string :content
end
end
def self.down
drop_table 'chunk'
end
end
... und:
class AddChunkChunks < ActiveRecord::Migration
def self.up
create_table 'chunk_chunks' do | t |
t.belongs_to :left_chunk
t.belongs_to :right_chunk
end
end
def self.down
end
end
Ich lief dann "rake db: create", "rake db: migrate" und die Konsole Befehle für mich gearbeitet wie folgt:
PondPro:testapp adh1003$ script/console
Loading development environment (Rails 2.3.5)
>> left = Chunk.new({:content => "chunk_one"}); left.save
=> true
>> right = Chunk.new({:content => "chunk_two"}); right.save
=> true
>> left.right_chunks << right
=> [#<Chunk id: 2, content: "chunk_two">]
>> left.right_chunks
=> [#<Chunk id: 2, content: "chunk_two">]
>> left.left_chunks
=> []
>> left = Chunk.new({:content => "chunk_three"}); left.save
=> true
>> right = Chunk.new({:content => "chunk_four"}); right.save
=> true
>> right.left_chunks << left
=> [#<Chunk id: 3, content: "chunk_three">]
>> right.left_chunks
=> [#<Chunk id: 3, content: "chunk_three">]
>> right.right_chunks
=> []
Die Datenbankinhalte nach oben waren:
chunk-devel=# SELECT * FROM chunks;
id | content
----+-------------
1 | chunk_one
2 | chunk_two
3 | chunk_three
4 | chunk_four
(4 rows)
chunk-devel=# SELECT * FROM chunk_chunks;
id | left_chunk_id | right_chunk_id
----+---------------+----------------
1 | 1 | 2
2 | 3 | 4
(2 rows)
Vor diesem Hintergrund:
... und folgt aus:
... Ich kann nichts wirklich falsch mit Ihrem ursprünglichen Code. Vielleicht sind die Wanderungen nicht, was Sie erwarten, vielleicht gibt es andere Teile des Code wurde nicht gebucht haben, die stören (zB Filter, andere Edelsteine) oder vielleicht die Activedatenbankadapter für MySQL ist nicht die richtigen Dinge in diesem Fall zu tun und / oder MySQL nicht richtig funktioniert. Es ist ein wenig langatmig PostgreSQL zu installieren und einzusetzen, dass anstelle von MySQL für weitere Tests, aber ich denke, dass es sich lohnen würde.
Für den Fall erweist es sich bei allen nützlichen ich die Testanwendungsdaten hier hochgeladen haben:
Wenn Sie herausfinden, was schief gelaufen ist und verwalten, sie zu korrigieren, schreiben Sie bitte eine Follow-up hier. Dies wird hilfreich sein, wenn jemand ähnliche Probleme in Zukunft begegnet und liest diesen Thread während Suche nach einer Lösung.
Andere Tipps
Ist das ein .reload Problem? Nachdem Sie dies tun in der Konsole:
right.left_chunks << left
tun
right.reload
dann versuchen
right.left_chunks
.