0

http://guides.rubyonrails.org/association_basics.html#self-joinsにある次の自己結合モデルの例は正しくないと思います。

class Employee < ActiveRecord::Base
  has_many :subordinates, :class_name => "Employee",
    :foreign_key => "manager_id"
  belongs_to :manager, :class_name => "Employee"
end

以下のようにすべきだと思います。どちらが正しいのか、その理由を教えてください。

class Employee < ActiveRecord::Base
  has_many :subordinates, :class_name => "Employee",
  belongs_to :manager, :class_name => "Employee", :foreign_key => "manager_id"
end

私の理論的根拠:モデルベアリングbelongs_toリレーションは、それが参照するモデルのforeign_keyを運びます。

4

2 に答える 2

0

例は正しいです。

ここでは「設定より規約」というマントラが適用されます。"#{name_of_association}_id"

したがってbelongs_to :manager, :class_name => "Employee"、外部キーがmanager_id

ただし、子の外部キーであるとhas_many :subordinates, :class_name => "Employee"想定subordinates_idされるため、if を定義する必要があります。:foreign_keyhas_many 内の の定義は子用であり、現在のモデルの に対して結合されidます。

于 2012-07-18T22:32:02.427 に答える
0

あなたは正しいです。そうあるべきです。

ただし、そのような状況では、acts_as_tree などを使用して階層を構築します。Employee.first.descendantsその人のために働くすべての人を見つけるなどのことを呼び出すことができます。

于 2012-07-18T20:07:45.080 に答える