Подтвердить что ты не робот

Понимание Rails ActiveRecord "одиночная модель" присоединяется

Мне сложно понять, как реализовать единую модель самостоятельного объединения в Rails. Руководство по ActiveRecord Associations раздел 2.10 вкратце объясняет Self-Joins, но не предоставляет достаточно информации, и каждый пример или сообщение об этом такие ссылки Friendly Друг Railcast, который не является самостоятельным подключением к одной модели, как описано в Rails Guide section 2.10.

Идея - это модель, которая has_many и принадлежит самому себе, без отдельной таблицы отношений. Единственная причина, по которой я вижу необходимость в отдельной таблице, - это если вы хотите, чтобы отношение содержало больше информации, чем просто отношения. например "лучшие друзья", "едва знают их"

У меня простая схема сообщений:

create_table "posts", :force => true do |t|
    t.datetime "posted"
    t.string   "nick"
    t.string   "title"
    t.text     "content"
    t.integer  "parent_post_id"
    t.datetime "created_at",     :null => false
    t.datetime "updated_at",     :null => false
end

parent_post_id - это самореклама к другому сообщению post_id. Модель posts.rb имеет указанное соотношение:

class Post < ActiveRecord::Base
  has_many :replies, :class_name => "Post"
  belongs_to :parent_post, :class_name => "Post",
    :foreign_key => "parent_post_id"
end

В контроллере или представлении я надеюсь, что смогу сделать что-то вроде этого:

@posts.each do |post|
  ...
  @replies = post.replies
  @replies.each do |reply|
    ...
  end
end

Или найти родительский пост:

@parent_post = post.parent_post

Все это может быть некорректным пониманием синтаксиса. Поэтому заранее спасибо всем, кто может похлопать меня по смыслу. Я просмотрел все сообщения SO и блога, и никто не пробовал метод самосогласованного самосоединения одной модели, описанный в Руководстве.

Баллы для тех, кто предлагает объяснение, которое не указывает на пример Friendly Friend, который использует отдельную таблицу отношений.

4b9b3361

Ответ 1

Мне не хватает внешнего ключа has_many для "parent_post_id". После его установки post.replies будут ссылаться на другие экземпляры Post parent_post_id.

Модель posts.rb имеет указанное соотношение:

class Post < ActiveRecord::Base
  has_many :replies, :class_name => "Post",
    :foreign_key => "parent_post_id"
  belongs_to :parent_post, :class_name => "Post",
    :foreign_key => "parent_post_id"
end

Теперь я могу создавать сообщения, назначать parent_post_id другой Почте, а затем получать все сообщения, которые являются ответами на любой родительский пост.