Ассоциации в Rails Engine не работают

#ruby-on-rails #activerecord #associations #rails-engines

#ruby-on-rails #activerecord #ассоциации #rails-двигатели

Вопрос:

Я создаю свой первый Rails engine и уже довольно запутался, определяя ассоциации между двумя моделями. Для простоты предположим, что имя движка — Blorg, имеющее две модели Article и Author .

blorgh/article.rb

 module Blorgh
  class Article < ApplicationRecord
    belongs_to :author, class_name: 'Blorg::Author',
                          foreign_key: 'blorg_author_id', optional: true
 

blorgh/author.rb

 module Blorgh
  class Author < ApplicationRecord
    has_many :articles, class_name: 'Blorg::Article'
 

схема

 create_table "blorgh_authors", force: :cascade do |t|
    t.string "name"
    t.boolean "inactive", default: false
    t.datetime "created_at", precision: 6, null: false
    t.datetime "updated_at", precision: 6, null: false

create_table "blorgh_articles", force: :cascade do |t|
    t.string "title"
    t.bigint "blorgh_author_id"
    t.datetime "created_at", precision: 6, null: false
    t.datetime "updated_at", precision: 6, null: false
    t.index ["blorgh_author_id"], name: "index_blorgh_article_on_author_id"
 

Если я пытаюсь создать статью или посчитать статьи автора через rails c, я получаю эти ошибки:

 article = Blorgh::Article.new(title: 'New Article')
article.save # expect true
# ==> NoMethodError: private method `attribute' called for #<Blorgh::Article:0x00007fdc3fad4d50>

author = Blorgh::Author.create # worked
author.articles.count # expect 0
# ==> ActiveRecord::StatementInvalid: PG::UndefinedColumn: ERROR:  column blorgh_articles.author_id does not exist
 

Кто-нибудь знает, как я могу правильно использовать эти ассоциации в движке?

Комментарии:

1. Я не могу воспроизвести первую проблему, хотя в вашем примере есть проблемы, которые я не могу определить, являются ли они частью вашего кода / проблемы или проблемы с вашим примером (например, по умолчанию таблица статей будет blorgh_articles вместо blorgh_article ). Однако вторая проблема заключается в том, что Rails предполагает, что внешний ключ для has_many отношения — classname_id (так, author_id ). При использовании модели с пространством имен вам просто нужно указать foreign_key has_many как сбоку, так и belongs_to сбоку.

2. Спасибо @rmlockerd! На самом деле это уже было 🙂 Мне просто нужно было правильно добавить внешний ключ, и вторая проблема сработала. Во-первых, теперь я обнаружил, что это связано с более сложной проверкой, которая у меня есть. Поскольку я знаю это сейчас, я могу пойти оттуда. что касается blorgh_article проблемы, это было связано с моим примером, извините… Я редактирую его в вопросе. Не стесняйтесь оставлять свой комментарий в качестве ответа, чтобы я мог его отметить 🙂

Ответ №1:

Вторая ошибка («столбец blorgh_articles.author_id не существует») заключается в том, что Rails предполагает, что внешним ключом для has_many отношения является classname_id, который находится author_id в вашем примере. Вы правильно установили внешний ключ на belongs_to стороне, но вам нужно указать на обеих сторонах отношения. Итак:

 module Blorgh
  class Author < ApplicationRecord
    has_many :articles, class_name: 'Blorg::Article', foreign_key: 'blorg_author_id'
...