Модель ActiveRecord без первичного ключа

У меня есть модель ActiveRecord GPA, у которой нет первичного ключа:

class GPA < ActiveRecord::Base

end

Когда я пытаюсь позвонить GPA.first.to_json, я получаю TypeError: false is not a symbol. Я предполагаю, что это связано с тем, что ActiveRecord пытается найти первичный ключ. Каков правильный способ реализации модели без первичного ключа?

enter image description here

Ответ 1

Обычно есть либо столбец, либо комбинация столбцов, которые вместе образуют первичный ключ. Когда вы говорите, что ваша таблица не имеет первичного ключа, вы имеете в виду, что у нее нет поля id?

Есть ли другой столбец, который является уникальным/естественным ключом? Если это так, вы можете сделать:

class GPA < ActiveRecord::Base
  set_primary_key :strm    # eg column strm is a unique/natural key
end

Вы также можете использовать составные клавиши с составными ключами gem следующим образом:

class GPA < ActiveRecord::Base
  set_primary_keys :student_id, :strm
end

Ответ 2

Весьма целесообразно использовать соглашения по умолчанию rails при моделировании ваших данных. Только переопределять значения по умолчанию, если вы имеете дело с устаревшими таблицами.

Вариант 1

Вы должны переопределить первичный ключ для своей модели, выполнив следующие действия:

class Foo < ActiveRecord::Base
    self.primary_key = "strm"
end

Теперь, если вы вызываете .to_json, json будет включать в себя ключ id вместо strm.

Вариант 2

Альтернативой является использование конструкторов json, таких как jbuilder, поэтому он не пытается преобразовать несуществующий 'id' в json используя конструктор javascript по умолчанию.

Ответ 3

Вам нужно что-то подобное в ваших миграциях или схеме

create_table :gpas, :id => false do |t|
  t.int :strm
  t.string :gpa
  t.string :acad_career
  t.int :student_id
end

Ответ 5

Добавьте перенос, который добавляет id в качестве столбца. Это не повредит существующий код. Просто убедитесь, что он получил автоинкремент, поэтому он не будет стонать о дублирующейся записи 0.