has_many :خلال الذاتي المرجعية جمعية
-
20-09-2019 - |
سؤال
لدي مشكلة مع الذات المرجعي جمعية النماذج يجب أن تعطي ma مجموعة من نماذج left_chunks و right_chunks الطرق, ولكن يمكنني الحصول في كل مرة صفيف فارغ
المصدر
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
الناتج من ./النصي/وحدة التحكم
>> #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
=> []
لماذا قطع لا بد معا ؟
قاعدة البيانات بعد تنفيذ التعليمات البرمجية
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 |
+----+---------------+----------------+---------------------+---------------------+
أي أفكار ؟
المحلول
لا تقول ما هو إصدار MySQL, روبي أو القضبان كنت على.لقد حاولت هذا مع اختبار صغير التطبيق وانها عملت بشكل صحيح.أنا باستخدام كيو 8.4.1 على OS X 10.6.أنا خلقت فقط فارغة التطبيق على القضبان 2.3.5 / روبي 1.8.7 (2009-06-12 patchlevel 174) مع "القضبان testapp" ، ثم أضاف نموذجين في قطعة.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)
ونظرا لهذا:
و هذا:
...لا أستطيع أن أرى أي شيء خطأ مع رمز الأصلي.ولعل الهجرات ليست ما كنت أتوقع أنه ربما تكون هناك أجزاء أخرى من التعليمات البرمجية الخاصة بك لديك لم تنشر والتي هي التدخل (على سبيل المثالمرشحات, الأحجار الكريمة الأخرى) أو ربما ActiveRecord قاعدة بيانات محول الخلية لا تفعل الأمور في نصابها الصحيح في هذه الحالة و/أو الخلية ليست المنفذ بشكل صحيح.وهو طويل قليلا ينضب إلى تثبيت كيو و استخدام هذا بدلا من MySQL لمزيد من الاختبارات ، ولكن أعتقد أنه سوف يكون من المفيد.
فقط في حال كان يثبت في كل المفيدة لقد قمت بتحميل تطبيق اختبار البيانات هنا:
إذا كان يمكنك معرفة ما حدث من خطأ و إدارة لتصحيح ذلك, الرجاء نشر المتابعة هنا.هذا وسوف يكون من المفيد إذا كان أي شخص واجه مشكلة مماثلة في المستقبل ويقرأ هذا الموضوع أثناء البحث عن حل.
نصائح أخرى
هل هذه مشكلة .reload؟ بعد القيام بذلك في وحدة التحكم:
وright.left_chunks << left
والقيام
وright.reload
وثم حاول
وright.left_chunks
.