2017-02-13 3 views
1

Я столкнулся с этой ошибкой, пытаясь решить проблему «Курица и яйцо» с пользователями и командами в моем коде. Я просмотрел интернет, и это, похоже, является общей ошибкой, и ни одно из решений не имеет смысла, учитывая мою ситуацию.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.

ответ

2

Использование

user = User.new(name: "sudo", email: "[email protected]", team: team) 

, так как в id = team.save, он будет хранить либо true или false. В зависимости от того, успешно ли сохранен код или какая-либо ошибка произошла как ошибка проверки, он вернет true или false соответственно.

Если вы хотите сохранить с удостоверением затем попробовать что-то, как показано ниже:

team = Team.new(...) # create team with right attributes inside `new` 
team.save 
user = User.new(name: "sudo", email: "[email protected]", team_id: team.id) # notice the `team_id` 

Поскольку вы будете экономить по идентификатору, вы должны использовать имя столбца forign_key непосредственно. В противном случае, если вы используете атрибут team, вам придется указать объект Team, а не целочисленный объект, такой как id (пример 21).

+0

Ничего себе, я действительно просто думал об этом? С тех пор, как вы так быстро научились рисовать - ум помогал мне с еще одной вещью? (Я отвечу вам как ответ еще на 9 минут) 'NameError: uninitialized constant Команда :: Owner' Как я могу решить эту проблему с курицей и яйцом? Я не могу сделать пользователя без команды, и я не могу сделать команду без владельца. Есть ли такая вещь, как «нулевой» uuid? – NictraSavios

+0

Вы не разместили свою модель «Владелец», но, я думаю, не должно возникнуть никаких проблем при создании Владельца, так как ваша команда имеет одного владельца, не являющегося ассоциацией belongs_to. И я предполагаю, что вы отправили сообщение из какого-то другого места. Может потребоваться дополнительная информация о структуре и кодах моделей. о null "uuid", у меня нет большой идеи, но вы можете отключить проверку наличия в 'own_to' в config. – Sajan

+0

«Владелец» - это просто пользователь, он должен быть установлен на идентификатор члена команды. (Я не выполнил эту проверку) Итак, модель владельца - это только модель пользователя. Ошибка, которую я опубликовал, исходит из «Теста», который я опубликовал выше. – NictraSavios

Смежные вопросы