gpt4 book ai didi

ruby-on-rails - Rails:ActiveRecord::AssociationTypeMismatch Team() 预期,得到 String()

转载 作者:数据小太阳 更新时间:2023-10-29 08:58:40 25 4
gpt4 key购买 nike

我在尝试解决代码中用户和团队的“先有鸡还是先有蛋”问题时遇到了这个错误。我搜索了互联网,这似乎是一个常见错误,根据我的情况,没有任何解决方案有意义。

最小可行示例:

在 Rails 控制台上,我创建了一个新的(无效的)用户:

user = User.new(name: "sudo", email: "foo@example.com")

然后是一个有效的团队:

team = Team.new( name: "Test team, please ignore", tier: 0, owner: user.id, users: user.id)

获取ID:

id = team.save

然后尝试创建一个有效用户:

user = User.new(name: "sudo", email: "foo@example.com", team: id)

这些命令的输出分别是:

=> #<User id: nil, name: "sudo", email: "foo@example.com", 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",所以 ID 不应该是连续的。

我对这两种情况都感到困惑,为什么 ID 为零,或者为什么不匹配是 "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: "user@example.com", 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 应用程序开发方面缺乏经验。

最佳答案

使用

user = User.new(name: "sudo", email: "foo@example.com", team: team) 

因为在 id = team.save 中,它将存储 truefalse。根据代码是否成功保存对象或是否发生验证错误等错误,它将分别返回 truefalse

如果您想使用 ID 保存,请尝试以下操作:

team = Team.new(...) # create team with right attributes inside `new`
team.save
user = User.new(name: "sudo", email: "foo@example.com", team_id: team.id) # notice the `team_id`

由于您将按 id 保存,因此您应该直接使用 forign_key 列名。否则,如果您使用 team 属性,那么您将必须提供一个 Team 对象,而不是像 id(例如 21)这样的整数对象。

关于ruby-on-rails - Rails:ActiveRecord::AssociationTypeMismatch Team() 预期,得到 String(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42200388/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com