Ruby on rails 设定数据库种子时类型不匹配

Ruby on rails 设定数据库种子时类型不匹配,ruby-on-rails,ruby,activerecord,seeding,Ruby On Rails,Ruby,Activerecord,Seeding,我正在尝试为应用程序数据库设置种子,但出现以下错误: ActiveRecord::AssociationTypeMismatch: Role(#97332160) expected, got Fixnum(#76482890) 下面是我的schema.rb中关于与问题相关的两个表的部分: create_table "roles", force: :cascade do |t| t.string "role", limit: 50, null: false t.datet

我正在尝试为应用程序数据库设置种子,但出现以下错误:

ActiveRecord::AssociationTypeMismatch: Role(#97332160) expected,
got Fixnum(#76482890)
下面是我的
schema.rb
中关于与问题相关的两个表的部分:

create_table "roles", force: :cascade do |t|
  t.string   "role",       limit: 50, null: false
  t.datetime "created_at",            null: false
  t.datetime "updated_at",            null: false
end

create_table "users", force: :cascade do |t|
  t.string   "first_name", limit: 100, null: false
  t.string   "surname",    limit: 100, null: false
  t.string   "email",      limit: 255
  t.integer  "role_id",    limit: 11
  t.string   "password",   limit: 150
  t.datetime "created_at",             null: false
  t.datetime "updated_at",             null: false
end

add_index "users", ["first_name"], name: "index_users_on_first_name", using: :btree
add_index "users", ["role_id"], name: "index_users_on_role_id", using: :btree
add_index "users", ["surname"], name: "index_users_on_surname", using: :btree

add_foreign_key "users", "roles"
下面是我的
种子.rb
命令:

rl = Role.create(role: "root")
User.create(first_name: "Edvaldo", surname: "Silva de Almeida Júnior", email: "edvaldo@my.domain.com", role_id: rl.id, password: "my_password")

rl = Role.create(role: "admin")
User.create(first_name: "Daiely", surname: "Fanchin", email: "daiely@my.domain.com", role_id: rl.id, password: "other_password")

rl = Role.create(role: "user")
User.create(first_name: "César", surname: "Silva", email: "cesar@my.domain.com", role_id: rl.id, password: "yet_other_password")
我发现接受的答案建议我应该这样做:

rl = Role.create(role: "root")
User.create(first_name: "Edvaldo", surname: "Silva de Almeida Júnior", email: "edvaldo@my.domain.com", role_id: Role.find(rl.id), password: "my_password")
我试过了,但还是犯了同样的错误!此外,我使用
角色\u id
作为关联,而不是角色本身。因此,就我而言,它应该接收一个
Fixnum
,而不是
Role
添加外键“users”,“roles”
这将向用户添加
Role\u id
列,用户无需单独编写
t.integer“Role\u id”,限制:11

应该有一些联系

  class User < ActiveRecord::Base
    belongs_to :role
  end 

希望它能解决这个问题。

我在我的用户模型中添加了一个方法设置默认角色

class User < ActiveRecord::Base
  has_one :role
  after_initialize :set_default_role, :if => :new_record?

  def set_default_role
    if User.count == 0
      self.role ||= 1
    else
      self.role ||= 2
    end
  end

end
我的播种效果很好

所以,问题是我(在这个方法中)试图将角色设置为Fixnum


这是对Rails新手的一个建议:种子设定不仅仅是强制数据库中的某些内容。这是对模型的全面评估,有时错误可能是由某些方法的执行引起的,而不仅仅是您尝试加载的值。

您遇到的问题很简单:

role_id: Role.find(rl.id)

返回一个
角色
对象

您的
create
方法需要一个(整数)(
role\u id:[int]

简单的解决办法是:

 User.create(... role_id: Role.find(rl.id).id ...)
。。或者

     User.create(... role_id: rl.id ...)
。。。或者更好

 User.create(... role: rl ...)
--

修理 真正的解决方法是在数据库中设置
默认值
,或者手动设置
角色id
,就像您在提交的答案中所做的那样

我强烈建议您使用数据库
default
,因为这样无论您的应用程序中发生了什么,您的数据库将始终“默认”为您设置的角色:

$ rails g migration SetDefaultForRole

$ db/migrate/set_default_for_role_____.rb
class SetDefaultForRole < ActiveRecord::Migration
   def change
      change_column :users, :role_id, :integer, default: 0
   end
end

$ rake db:migrate

感谢您的友好交流,@Drenmi.com,而不是
role\u id:role.find(rl.id)
您可以尝试
role:r1
请发布关联
添加外键“users”,“roles”
这将添加
role\u id
无需单独编写
t.integer“role\u id”,限制:11
尝试过,@Rots,但现在我得到了ActiveRecord::UnknownAttributeError:用户的未知属性“角色”。你是说模型@RajarshiDas?这已经完成了。协会还可以。当我去检查我的用户模型时,我发现了真正的问题,我将把它作为未来参考的答案发布。谢谢!这里可能还有另一个教训。堆栈跟踪是否告诉您发生错误的代码行和文件?在这种情况下,课程是如何正确解释错误日志/消息。耶!这真是个新手的错误。我做到了!对不起,但是Role.find(rl.id).id毫无意义。如果我已经有了要搜索的rl.id,为什么我要搜索只是为了找到相应的角色,然后选择我已经在r.id中的id?这是你的代码。我只是解释一下你是如何解决的。毕竟,是你使用了
Role.find(rl.id)
……是的。我有这个角色。我只是问这样做有什么好处。正在搜索知道其id的角色,以便再次选择此id。也许我错过了什么,但在我看来,我这样做是在兜圈子。不过还是要谢谢你,这一点好处都没有。我只是说不能用对象填充
role\u id
,它必须是一个整数值。你可以从
Role.find(x).id
rl.id
中得到这个整数。你不会在循环中运行,我正在解释你的错误,以及修复它的简单方法。你的模式完全是另一回事
 User.create(... role: rl ...)
$ rails g migration SetDefaultForRole

$ db/migrate/set_default_for_role_____.rb
class SetDefaultForRole < ActiveRecord::Migration
   def change
      change_column :users, :role_id, :integer, default: 0
   end
end

$ rake db:migrate
#app/models/user.rb
class User < ActiveRecord::Base
   before_create :set_role, if: Proc.new { |m| m.role_id.blank? }

   private

   def set_role
     self.role_id = "1" if User.count == 0
   end
end