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?

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top