0

私は属し、has_many 関係を持っています。

子は親に属する_親に_多くの子を持つ.

ただし、親が子を持つことができる別の方法もあります。それは、親のタイプのグループ化を作成するために使用する join_table を使用することです。

これを行う方法についての私のひどい推測は次のとおりです。

# 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

私は実際にはこれらの命名規則を使用していないことに注意してください。これらは、私の作業を匿名にするために変更されました。

次に、私の移行は次のようになります。

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

したがって、私の目標は、入力すると、parent_groupを介しParent.find(n).childrenたChild オブジェクトと、それに直接関連するすべての子を返すようにすることです。

逆に、 を選択すると、親グループを介してChild.find(n).parentいるかどうかにかかわらず、その親が選択されます。

そして最後に、parent_groups を選択し、親のコレクションを選択できるようになります。

何か案は?

4

1 に答える 1

2

まず第一に、結合テーブルについて話している場合、このテーブルのスキーマ設定が正しくないと思います。次のようになります。

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

これで、テーブルparent_groupsは多くの親のために多くの子を保持できるようになりました。

モデルで関連付けを設定する場合: 2 つの異なる関連付けに同じ名前を付けることはできません/すべきではありません。したがって、同時に 1 つのモデルにhas_many :childrenすることはできません。has_many :children, :through => :parent_groupsRailsで子にアクセスする場合、Parent.find(n).children使用する関連付けがわかりません。

私はこのようなことをします:

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

そのほうが先だと思いますが…

于 2012-08-15T14:51:37.693 に答える