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.find(n).children,它将返回通过parent_group 和任何直接相关的子对象的子对象。

反之亦然,如果我选择 select 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可以为许多父母容纳许多孩子。

至于在模型中设置关联:您不能/不应该用相同的名称命名两个不同的关联。因此,您不能has_many :children同时has_many :children, :through => :parent_groups在一个模型中做到这一点。因为如果您通过Parent.find(n).childrenRails 访问子项,则不知道要使用哪个关联。

我会做这样的事情:

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 回答