イベントモデルがあります。イベントには、モデルの列(parent_event_id)から設定された親イベントを含めることができます。モデルでhas_many :event
を実行できる必要があるため、たとえば、event.child_event
またはevent.parent_event
を実行できます。しかし、私のグーグルはそれほどうまくいきませんでした。
私のモデル:
class Event < ActiveRecord::Base
attr_accessible :days_before, :event_name, :event_date, :list_id, :recipient_email, :recipient_name, :parent_event_id, :is_deleted, :user_id
belongs_to :user
has_many :event_email
has_many :event
end
私のスキーマ:
create_table "events", :force => true do |t|
t.datetime "event_date"
t.integer "days_before"
t.string "recipient_email"
t.integer "list_id"
t.string "recipient_name"
t.datetime "created_at", :null => false
t.datetime "updated_at", :null => false
t.integer "user_id"
t.string "event_name"
t.integer "parent_event_id"
t.boolean "is_deleted", :default => false
end
これは自己参照モデルであり、次のようなものを試すことができます。
class Event < ActiveRecord::Base
belongs_to :parent, :class_name => "Event", :foreign_key => "parent_event_id"
has_many :child_events, :class_name => "Event", :foreign_key => "child_event_id"
end
そうすれば、@ event.parentを呼び出してActiveRecordイベントオブジェクトを取得し、@ event.child_eventsを呼び出してイベントオブジェクトのActiveRecordコレクションを取得できます。
Has_manyを次のようなものに変更する必要があります。
has_many :parent_events, class_name: 'Event'
has_many :child_events, ->(event) { where parent_event_id: event.id }, class_name: 'Event'
これはRailsリンクの4つのドキュメントからです: http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html
具体的には、「クエリのカスタマイズ」に関するセクションです。これにより、探していることを実行できるようになります。ローカルで試していませんでしたが、これは、しばらく前に行ったフットボールのピッケムアプリを実装するために私がしなければならなかったことと似ています。
お役に立てれば。
Railsには、ネストされたツリー構造ancestryを提供するためのgemがすでにあります。このようなシナリオで最適になります。
https://github.com/stefankroes/ancestry
次の方法にアクセスできます。
event.parent
event.children
event.siblings
試してください 入れ子集合パターン
これについて: 素晴らしい入れ子集合
Rails 5では、所属がデフォルトで必須になっているため、モデルインスタンスを保存できませんでした...推奨されるソリューションの最初の行にオプションを追加すると、これが修正されます...
class Event < ActiveRecord::Base
belongs_to :parent, :class_name => "Event", :foreign_key => "parent_event_id", optional: true
has_many :child_events, :class_name => "Event", :foreign_key => "parent_event_id"
end