Модели пространства имен с монгоидом - PullRequest
0 голосов
/ 30 июня 2018

Это не должно быть слишком сложно, но я не нахожу никакого ответа на это. Попытка упорядочить мои модели в папках и вставлять документы с помощью рельсов и монгоидов.

Структура моей папки:

app/models/book.rb  Book
app/models/book/author.rb   Book::Author
app/models/book/author/bio.rb   Book::Author::Bio
app/models/book/author/interest.rb  Book::Author::Interest

Мои классы моделей:

class Book
    include Mongoid::Document
    include Mongoid::Timestamps
    belongs_to :user, inverse_of: :books
    embeds_many :authors
end
class Book::Author
    include Mongoid::Document
    include Mongoid::Timestamps
    belongs_to :book, inverse_of: :authors
    embeds_many :bios
end
class Book::Author::Bio
    include Mongoid::Document
    include Mongoid::Timestamps
    belongs_to :author, inverse_of: :bios
end
class Book::Author::Interest
    include Mongoid::Document
    include Mongoid::Timestamps
    belongs_to :author, inverse_of: :interests
end

Когда я делаю:

book = Book.new
book.author

Тогда я получу uninitialized constant Author

Использование монгоида 7.0.1 и рельсов 5.2

Я пытался поиграть со структурой, именами классов и т. Д., Но я не уверен, что мне не хватает.

1 Ответ

0 голосов
/ 30 июня 2018

Поскольку комментарий @mu слишком короткий, вам нужно указать class_name вместе с определенными ассоциациями, если они не следуют соглашению. Вот как вы можете заставить его работать:

class Book
  include Mongoid::Document
  embeds_many :authors, class_name: 'Book::Author'
end

class Book::Author
  include Mongoid::Document

  # `embedded_in` will suit this relation better
  embedded_in :book, inverse_of: :authors
  embeds_many :bios, class_name: 'Book::Author::Bio'
end

class Book::Author::Bio
  include Mongoid::Document
  embedded_in :author, class_name: 'Book::Author', inverse_of: :bios
end

class Book::Author::Interest
  include Mongoid::Document

  # I don't see a relation `interests` anywhere in your models
  belongs_to :author, class_name: 'Book::Author', inverse_of: :interests
end

Но я немного запутался, почему вы хотите хранить их таким образом. Почему автор должен быть встроен в книгу, поскольку один автор может иметь несколько книг? Я бы изменил структуру на что-то вроде:

class Book
  include Mongoid::Document
  has_and_belongs_to_many :authors
end

class Author
  include Mongoid::Document
  has_and_belongs_to_many :books
  embeds_many :bios, class_name: 'Author::Bio'
  embeds_many :interests, class_name: 'Author::Interest'
end

class Author::Bio
  include Mongoid::Document
  embedded_in :author, inverse_of: :bios
end

# Not exactly sure what this model is for, so with limited information, i will keep it under namespace `Author`.
class Author::Interest
  include Mongoid::Document
  embedded_in :author, inverse_of: :interests
end
...