Rails - ассоциируйте три модели - PullRequest
0 голосов
/ 05 мая 2018

Наличие трех моделей: Datum, Author и Book.

class Datum < ApplicationRecord
  has_many :authors
end

class Book < ApplicationRecord
 belongs_to :author
end

class Author < ApplicationRecord
 belongs_to :datum
 has_many :books, dependent: :destroy
end

Для целей упражнения я хотел смоделировать, чтобы у Datum (более общего характера) было много авторов, у которых могут быть книги. После создания базового объекта и связанного с ним автора я мог бы назвать nameofdatum.authors, но если я добавлю книгу этому автору, он не сможет быть распознан через nameofdatum.authors.books. У меня неправильные ожидания? (Если это будет сделано с помощью «до» (объяснение этого было бы очень ценно)

(здесь схема при необходимости)

 create_table "authors", force: :cascade do |t|
    t.string "name"
    t.integer "age"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
    t.integer "book_id"
    t.integer "datum_id"
    t.index ["book_id"], name: "index_authors_on_book_id"
    t.index ["datum_id"], name: "index_authors_on_datum_id"
  end



 create_table "books", force: :cascade do |t|
    t.string "name"
    t.string "book_type"
    t.integer "pages"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
    t.integer "author_id"
    t.index ["author_id"], name: "index_books_on_author_id"
  end



create_table "data", force: :cascade do |t|
    t.string "region"
    t.integer "budget"
    t.date "aval"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
  end

Ответы [ 2 ]

0 голосов
/ 05 мая 2018

Должно ли это быть сделано с помощью 'through'?

Да, Datum has_many books через ассоциацию authors:

class Datum < ApplicationRecord
  has_many :authors
  has_many :books, through: :authors
end

И books можно выбрать с помощью:

Datum.last.books

На самом деле он выбирает books, используя следующий запрос:

SELECT  "books".* FROM "books" INNER JOIN "authors" ON "authors"."id" = "books"."author_id" WHERE "authors"."datum_id" = ?
0 голосов
/ 05 мая 2018

Если вы хотите добавить новую книгу через автора, вы должны назначить автора. Так что вы можете попробовать: nameofdatum.author.books.build ....

ваш код nameofdatum.authors.books, вы не можете использовать множественное число (автор), чтобы добавить новую книгу. Надеюсь помочь вам.

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