2010-02-14 2 views
1

는 모델은 엄마에게 left_chunks에 대한 모델의 배열을주고 방법을 right_chunks, 그러나 나는 하늘의 배열has_many : 통해, 자기 참조 협회 나는 자기 참조 협회에 문제가

에게 매번 소스를 얻어야한다

>> #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 
=> [] 

./script/console

에서
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 

출력은 왜 덩어리 함께 바인딩되지 않습니다? 코드 실행

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 | 
+----+---------------+----------------+---------------------+---------------------+ 

어떤 아이디어 후

데이터베이스?

+0

생성 된 SQL의 모습을 보려면'development.log' 파일을 살펴 보셨습니까? – JRL

답변

3

현재 사용중인 MySQL, Ruby 또는 Rails의 버전을 말하지 않습니다. 난 그냥 작은 테스트 응용 프로그램과 이것을 시도하고 제대로 작동했습니다. OS X 10.6에서 PostgreSQL 8.4.1을 사용하고 있습니다. 난 그냥 다음, "레일에 testapp"와 레일 2.3.5/루비 1.8.7 (2009-11-27 패치 레벨 174)에 빈 응용 프로그램을 만들어 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 

을 ... 및 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 
... 플러스 두 마이그레이션이 간결 타임 스탬프없이 테이블을 추가하기 :

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 

... 그리고 :

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 

그때 "레이크 dB : 생성"실행 "레이크 DB : 마이그레이션"을 다음과 같이 콘솔 명령은 나를 위해 일한 : 위의 후

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 
=> [] 

데이터베이스 내용이 있었다 :

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) 

이 주어 :

16,... 이것은 :

... 나는 원래 코드 정말 아무 잘못 볼 수 없습니다. 아마도 마이그레이션이 예상 한 것과 다를 수 있습니다. 아마도 게시자가 게시하지 않은 다른 부분 (예 : 필터, 기타 보석) 또는 MySQL 용 ActiveRecord 데이터베이스 어댑터가이 경우 올바른 작업을 수행하지 못하는 것일 수 있습니다 및/또는 MySQL이 올바르게 작동하지 않습니다. PostgreSQL을 설치하고 추가 테스트를 위해 MySQL 대신 사용하는 것은 다소 오래 지속되었지만 가치가 있다고 생각합니다.당신은 무엇이 잘못되었는지 알아 내고 그것을 해결하기 위해 관리하는 경우, 게시하시기 바랍니다

:

그냥 케이스에 내가 여기 테스트 응용 프로그램 데이터를 업로드 한 모든 유용한에서 증명 후속 조치. 이것은 나중에 누군가가 비슷한 문제를 만나 솔루션을 검색하는 동안이 스레드를 읽는 경우에 유용합니다.

+0

덧붙여서 ChunkChunk를 Binding으로 이름을 바꾸면 코드가 읽기 쉽습니다. –

0

문제가 있습니까? 콘솔에서이 작업을 수행 한 후 :

right.left_chunks << left

right.reload

다음

right.left_chunks 시도 할.