web-dev-qa-db-ja.com

railsモデルhas_manyof自体

イベントモデルがあります。イベントには、モデルの列(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
33

これは自己参照モデルであり、次のようなものを試すことができます。

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コレクションを取得できます。

68
derekyau

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

具体的には、「クエリのカスタマイズ」に関するセクションです。これにより、探していることを実行できるようになります。ローカルで試していませんでしたが、これは、しばらく前に行ったフットボールのピッケムアプリを実装するために私がしなければならなかったことと似ています。

お役に立てれば。

4
Mike Waldrup

Railsには、ネストされたツリー構造ancestryを提供するためのgemがすでにあります。このようなシナリオで最適になります。

https://github.com/stefankroes/ancestry

次の方法にアクセスできます。

event.parent
event.children
event.siblings
2
Aman Garg

試してください 入れ子集合パターン

これについて: 素晴らしい入れ子集合

1
Oleg Haidul

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
0
Phil