«Объединение» с двумя таблицами не работает из-за «ActiveModel :: MissingAttributeError» - PullRequest
0 голосов
/ 17 марта 2020

Я пишу свое заявление на Ruby -on-Rails, и у меня проблема с "соединениями". Есть 3 таблицы: todo_lists, users, statuses. Каждая задача имеет одного пользователя и один статус, и они представлены как идентификаторы. И я хочу получить всю задачу с именем статуса и именем пользователя вместо их идентификаторов. Вот как я пытался это сделать:

TodoList.joins(:user, :status)
  .select("
  todo_lists.id,
  todo_lists.title,
  todo_lists.description,
  statuses.name,
  users.name,
  todo_lists.deadline,
  todo_lists.is_disabled")
.as_json

Но это выдает ошибку MissingAttribute: missing attribute: status_id. Но я добавил user_id и status_id записей в свою таблицу todo_lists до этого. Что я должен сделать, чтобы решить эту проблему?

user.rb, status.rb, todo_list.rb файлы:

class User < ApplicationRecord
    has_many :todo_lists
end

class Status < ApplicationRecord
  has_many :todo_lists
end

class TodoList < ApplicationRecord
    belongs_to :status
    belongs_to :user
end

schema.rb файл:

ActiveRecord::Schema.define(version: 2020_03_17_071204) do

  create_table "statuses", force: :cascade do |t|
    t.string "name"
    t.datetime "created_at", precision: 6, null: false
    t.datetime "updated_at", precision: 6, null: false
  end

  create_table "todo_lists", force: :cascade do |t|
    t.string "description", null: false
    t.integer "user_id", default: 1, null: false
    t.datetime "created_at", precision: 6, null: false
    t.datetime "updated_at", precision: 6, null: false
    t.boolean "is_disabled"
    t.datetime "deadline"
    t.string "title", null: false
    t.integer "status_id", default: 1, null: false
  end

  create_table "users", force: :cascade do |t|
    t.string "name", null: false
    t.datetime "created_at", precision: 6, null: false
    t.datetime "updated_at", precision: 6, null: false
  end

  add_foreign_key "todo_lists", "statuses"
  add_foreign_key "todo_lists", "users"
end

Самое интересное, что если я присоединяюсь только с users таблицей, все работает нормально :) Полная трассировка стека:

ActiveModel::MissingAttributeError (missing attribute: status_id):

app/controllers/todos_controller.rb:75:in `get_all_todos'
app/controllers/todos_controller.rb:3:in `get'

И todos_controller.rb методы, где я использую "соединения":

def get
    render :json => get_all_todos
end

def get_all_todos
    TodoList.joins(:status, :user)
    .select("
         todo_lists.id,
         todo_lists.title,
         todo_lists.description,
         statuses.status,
         todo_lists.deadline,
         todo_lists.is_disabled")
    .as_json
end

1 Ответ

0 голосов
/ 17 марта 2020

Соединения выполняются on related столбец между двумя или более таблицами.

В указанной вами конфигурации вы пытаетесь присоединить списки todo_lists к таблице пользователей и статусов, но нет столбца отношений для присоединения on.

В то же время Причина, по которой todo_lists объединяется с пользователями, работает потому, что объединение выполняется для user_id столбца todo_lists.

ActiveRecord::MissingAttributeError вызвано тем, что он не может найти этот связанный столбец для объединения этих двух таблиц, я не уверен насчет ваших приложений, указывающих c domain logi c, но вы можете это исправить, добавив user_id foreign_key в таблицу todo_lists.

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