Я столкнулся с этой ошибкой, пытаясь решить проблему «Курица и яйцо» с пользователями и командами в моем коде. Я просмотрел интернет, и это, похоже, является общей ошибкой, и ни одно из решений не имеет смысла, учитывая мою ситуацию.Rails: ActiveRecord :: AssociationTypeMismatch Team() Ожидаемое, получено String()
Минимальный жизнеспособный Пример:
На консоли рельсов, я сделал новый (недопустимый) Пользователь:
user = User.new(name: "sudo", email: "[email protected]")
Тогда действительная команда:
team = Team.new(name: "Test team, please ignore", tier: 0, owner: user.id, users: user.id)
захватить ID:
id = team.save
Затем trie d, чтобы сделать правильный пользователь:
user = User.new(name: "sudo", email: "[email protected]", team: id)
Вывод из этих команд являются соответственно:
=> #<User id: nil, name: "sudo", email: "[email protected]", team_id: nil, created_at: nil, updated_at: nil>
=> #<Team id: nil, name: "Test team, please ignore", tier: 0, owner: nil, users: nil, created_at: nil, updated_at: nil>
ActiveRecord::AssociationTypeMismatch: Team(#47180498893940) expected, got TrueClass(#47180477068240)
Если я пытаюсь использовать team.id
, я получаю ту же ошибку с «String()» вместо «TrueClass "
Я использую enable_extension" uuid-ossp ", поэтому идентификаторы не должны быть последовательными.
Я запутался в обеих ситуациях, почему эти идентификаторы равны нулю, или почему несоответствие "Team(##47180498893940)"
и не "52b9f290-61e7-48b3-99a9-b0fb64d68b51"
как выход team.id
хотел бы предложить.
Мои тесты также дают ошибку строку:
class UserTest < ActiveSupport::TestCase
def setup
@team = Team.new(name: "Example Team", tier: 0, owner: "00000000-0000-0000-0000-000000000000")
@user = User.new(name: "Example User", email: "[email protected]", team: team_id)
end
test "should be valid" do
assert @user.valid?
end
end
Модели:
Команда:
class Team < ApplicationRecord
has_many :user
has_one :owner
end
Пользователь:
class User < ApplicationRecord
belongs_to:team
end
Схема:
ActiveRecord::Schema.define(version: 20170213070551) do
# These are extensions that must be enabled in order to support this database
enable_extension "plpgsql"
enable_extension "uuid-ossp"
create_table "teams", id: :uuid, default: -> { "uuid_generate_v4()" }, force: :cascade do |t|
t.string "name"
t.integer "tier"
t.string "owner"
t.string "users"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
end
create_table "users", id: :uuid, default: -> { "uuid_generate_v4()" }, force: :cascade do |t|
t.string "name"
t.string "email"
t.string "team_id"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
end
end
Если есть больше информации я могу предоставить, пожалуйста, дайте мне знать. Я неопытен в разработке приложений rails.
Ничего себе, я действительно просто думал об этом? С тех пор, как вы так быстро научились рисовать - ум помогал мне с еще одной вещью? (Я отвечу вам как ответ еще на 9 минут) 'NameError: uninitialized constant Команда :: Owner' Как я могу решить эту проблему с курицей и яйцом? Я не могу сделать пользователя без команды, и я не могу сделать команду без владельца. Есть ли такая вещь, как «нулевой» uuid? – NictraSavios
Вы не разместили свою модель «Владелец», но, я думаю, не должно возникнуть никаких проблем при создании Владельца, так как ваша команда имеет одного владельца, не являющегося ассоциацией belongs_to. И я предполагаю, что вы отправили сообщение из какого-то другого места. Может потребоваться дополнительная информация о структуре и кодах моделей. о null "uuid", у меня нет большой идеи, но вы можете отключить проверку наличия в 'own_to' в config. – Sajan
«Владелец» - это просто пользователь, он должен быть установлен на идентификатор члена команды. (Я не выполнил эту проверку) Итак, модель владельца - это только модель пользователя. Ошибка, которую я опубликовал, исходит из «Теста», который я опубликовал выше. – NictraSavios