Я пишу свое заявление на 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