Понимание Rails ActiveRecord "одиночная модель" самостоятельно присоединяется - PullRequest
13 голосов
/ 12 февраля 2012

Мне трудно понять, как реализовать одиночное модели самостоятельного соединения в Rails.* 201 Руководство по ассоциациям ActiveRecord, раздел 2.10 *1002*, кратко объясняет самостоятельные объединения, но не предлагает достаточно информации, и каждый пример или публикация об этом, например, ссылается на пример Friendly Friend Railcast, который не является самостоятельным соединением моделикак описано в разделе 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

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

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

Или найти сообщениеparent:

@parent_post = post.parent_post

Это может быть неправильное понимание синтаксиса.Так что заранее спасибо всем, кто может дать мне какой-то смысл.Я просмотрел все SO и посты в блогах, и никто не пробовал использовать единую модель самоссылочного метода самостоятельного соединения, описанную в Руководстве.

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

1 Ответ

25 голосов
/ 12 февраля 2012

Мне не хватало внешнего ключа 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в другое сообщение, а затем получить все сообщения, которые являются ответами на любое родительское сообщение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...