Ikki xil assotsiatsiyani bir xil ob'ekt bilan qanday baham ko'raman?

Menga tegishli va has_many munosabatlarim bor.

Bola ota-onaga tegishli Ota-onaning ko'p farzandi bor.

Biroq, menda Ota-ona farzand ko'rishning yana bir usuli bor va bu men ota-ona turini guruhlash uchun foydalaniladigan join_table orqali.

Buni qanday qilish haqida mening dahshatli taxminim:

# child.rb

belongs_to :parent
belongs_to :parent_group, :dependent => :destroy
delegate :parent, :to => :parent_group

# parent.rb

has_many :children
has_many :children, through: :parent_groups

E'tibor bering, men ushbu nomlash qoidalaridan foydalanmayman. Bular mening ishimni anonim saqlash uchun o'zgartirildi.

Keyin mening migratsiyalarim quyidagicha ko'rinadi:

class CreateParentGroup < ActiveRecord::Migration
  def self.up
    create_table :parent_groups do |t|
      t.integer :parent_id
      t.timestamps
    end
    add_column :child, :parent_group_id, :integer
  end

Shunday qilib, mening maqsadim shundan iboratki, agar Parent.find(n).children ni yozsam, u ota-ona_guruhi orqali boʻlgan Child obyektlarini va unga bevosita aloqador boʻlgan bolalarni qaytaradi.

Aksincha, agar men Child.find(n).parent ni tanlasam, u ota-ona guruhi orqalimi yoki yo'qmi, o'zining ota-onasini tanlaydi.

Va nihoyat, men parent_groups va ota-onalar to'plamini tanlashim mumkin edi.

Har qanday fikr bormi?


person Trip    schedule 15.08.2012    source manba


Javoblar (1)


Birinchidan, agar siz qo'shilish jadvali haqida gapirayotgan bo'lsangiz, menimcha, ushbu jadval uchun sxemani sozlash juda to'g'ri emas. Bu shunday bo'lishi kerak:

class CreateParentGroup < ActiveRecord::Migration
  def self.up
    create_table :parent_groups do |t|
      t.integer :parent_id
      t.integer :child_id
      t.timestamps
    end
  end
end

Shunday qilib, endi sizning stolingiz parent_groups ko'plab ota-onalar uchun ko'plab bolalarni sig'dira oladi.

Modellaringizda assotsiatsiyalaringizni o'rnatishga kelsak: Siz bir xil nomdagi ikkita turli assotsiatsiyani nomlay olmaysiz/kerak emas. Shuning uchun siz bitta modelda bir vaqtning o'zida has_many :children va has_many :children, :through => :parent_groups ni bajara olmaysiz. Sababi, agar siz bolalarga Parent.find(n).children Rails orqali kirsangiz, qaysi assotsiatsiyadan foydalanishni bilmaydi.

Men shunday bir narsa qilardim:

class Parent < AR
  has_many :regular_children, :class_name => 'Child'
  has_many :group_children, :class_name => 'Child', :through => :parent_groups

  # implement a method that combines them both
  def children
    regular_children + group_children
  end
end

class Child < AR
  belongs_to :parent
  belongs_to :parent_group, :dependent => :destroy

  # forget the delegate, otherwise your invoke of Child.find(n).parent always
  # gets delegated to parent_group which is/can be wrong due to data
end

Menimcha, bu ko'proq boradigan yo'l ...

person Vapire    schedule 15.08.2012
comment
Ajoyib! Katta rahmat Vapire! - person Trip; 15.08.2012