web-dev-qa-db-ja.com

レール上でRubyを使用して自己参照を行うにはどうすればよいですか?

RoRアプリでモデルを自己参照したいのですが、正確な方法がわかりません。次のノードが前のノードのIDを持つリンクリストを保存したいと思います。どうすればこれを行うことができますかRails方法?これは1対1の関係です。

24
JRafaelM

最も簡単な方法:

class MyModel < ActiveRecord::Base
  belongs_to :parent, :class_name => 'MyModel'
  has_many :children, :class_name => 'MyModel', :foreign_key => 'parent_id'
end
65
Hck

Rails 5

ユーザーテーブルに列xxx_idを追加します。

移行ファイル内:

add_reference :users, :xxx, index: true

ユーザーモデルにコードを追加します

has_many :users, class_name: 'User', foreign_key: 'xxx_id'
belongs_to :manager, class_name: 'User', foreign_key: 'xxx_id'

すべてのユーザーにマネージャーがない場合は、オプションのtrueを追加する必要があります。

'foreign_key'は必要ありません。デフォルトでは、これは小文字で「_id」という接尾辞が付いたこのクラスの名前であると推測されます。

外部キーがuser_idの場合、ユーザーにはマネージャーは必要ありません。結果は次のとおりです。

has_many :users, class_name: 'User'
belongs_to :manager, class_name: 'User', optional: true
13
YaEvan

Rails 3.2.14)を使用して機能させるためにしばらく時間を費やしました

自己結合アソシエーション に関するドキュメントの提案は、belongs_toアソシエーションでは機能しませんでした。外部キーを追加すると、問題が修正されました。

Class User < ActiveRecord::Base
  has_many :invitees, class_name: 'User', foreign_key: :invited_by
  belongs_to :Host, class_name: 'User', foreign_key: :invited_by
end
3
Vadym Tyemirov

自己参照の関連付けに関するRyanBatesによるこのチュートリアルもチェックしてください ここ 。 Hckの答えは機能しますが、私にとってはJOINテーブルが必要なので、Railsの関連付けを通じてhas_manyを使用します。幸運を!

0
okysabeni