Я пытаюсь заполнить базу данных приложения, но получаю следующую ошибку:

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"

А вот мои команды seeds.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")

Я пробовал это, но получил ту же ошибку! Кроме того, я использую role_id как ассоциацию, а не саму роль. Так что, насколько я понимаю, он должен получать Fixnum, а не Role.

2
Ed de Almeida 1 Янв 2016 в 12:25

2 ответа

Лучший ответ

Я добавил в свою модель пользователя метод set_default_role .

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

Но этот метод был неправильным , и как только я переписал его как

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

Мой посев работал нормально.

Итак, проблема заключалась в том, что я пытался (внутри этого метода) установить для роли Fixnum.

Это служит советом новичкам в Rails: Заполнение - это не просто принудительное добавление чего-либо в вашу базу данных. Это полная оценка вашей модели, и иногда ошибка может быть вызвана выполнением какого-либо метода, а не только значениями, которые вы пытаетесь загрузить.

1
Ed de Almeida 1 Янв 2016 в 10:07

add_foreign_key "users", "roles" это добавит столбец role_id для пользователей, которым не требуется отдельно писать t.integer "role_id", limit: 11

Должны быть какие-то ассоциации

  class User < ActiveRecord::Base
    belongs_to :role
  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.reference "role",      index: true
  t.string   "password",   limit: 150
  t.datetime "created_at",             null: false
  t.datetime "updated_at",             null: false
end


add_foreign_key "users", "roles", column: :role_id

Надеюсь, что это может решить эту проблему.

1
Rajarshi Das 1 Янв 2016 в 09:51