0

Я пытаюсь найти оптимальный способ моделирования моей базы данных.
фона:Модельные ассоциации в Rails has_one с class_name

  • я в настоящее время есть две рельсы модели, одна называется Environment, а другой называется StatusUpdate.

  • У меня есть программа, которая находится на разных серверах и отправляет StatusUpdates для Environments. Эти обновления содержат четыре части информации об окружающей среде.

  • У меня есть индексный экран, который показывает мне все Environments. (Модели, приведенные ниже)

    • Моя цель - показать пользователю всю информацию из последнего обновления статуса об окружающей среде.
  • Я хранить десять самые последние StatusUpdates и что-нибудь> 10 удаляется при получении нового.

Принципиальное расположение индекса
- среды1 --Status_Field_1 - Status_Field_2 - Status_Field_3 - Status_Field_4--
- Environment2 --Status_Field_1 - Status_Field_2 - Status_Field_3 - Status_Field_4--
- Environment3 --Status_Field_1 - Status_Field_2 - Status_Field_3 - Status_Field_4--
- Environment4 --Status_Field_1 - Status_Field_2 - Status_Field_3 - Status_Field_4--

Текущая схема

Environment(name):has_many StatusUpdates 
StatusUpdate(field1, field2, field3, field4): belongs_to Environment  

Среды Контроллер

def index 
    @environments = Environment.paginate(page: params[:page]) 
end 

Я затем вынести @environments используя частичное.

Вопрос
Текущая схема представляется целесообразным, но я подозреваю, что я должен был бы сделать дополнительный вызов к базе данных в EnvironmentsController во время индексной функции. Я могу изменить схему Environment, чтобы включить поля 1 - 4? Или есть способ выполнить Environment.paginate при получении последнего StatusUpdate из базы данных для каждой среды?

Рекомендация H-man звучит превосходно, но я не могу понять, почему я получаю неожиданную ошибку tLabel в моей модели с ассоциацией has_one, которую он рекомендовал. Для справки:

class Environment < ActiveRecord::Base 
    has_many: status_updates 
    has_one: current_status, -> { order: 'created_at DESC' }, class_name: 'StatusUpdate' 
end 

Rails 4.0.2

ответ

1
class Environment < ActiveRecord::Base 
    has_many :status_updates 
    has_one :current_status, -> {order 'created_at DESC'}, class_name: 'StatusUpdate' 
end 

Тогда вы можете сделать это:

def index 
    @environments = Environment.includes(:current_status).paginate(page: params[:page]) 
end 

Это стремится разгрузить текущий статус обновления для всех сред на одном дыхании. Я предполагаю, что вы используете Rails 4, так как вы не упомянули версию #. Если вы используете более старую версию рельсов, используйте вместо этого:

+0

Для первого блока кода я заметил, что у вас была 'def Environment ...' вместо 'class Environment ...', есть цель для этого или просто опечатка? Я подозреваю, что последнее, но я столкнулся с ошибкой и хотел убедиться, что =] В настоящее время появляется ошибка «неожиданный tLABEL», а код ссылается на ассоциацию has_one в модели. 'has_one: current_status, -> {order: 'created_at DESC'}, class_name: 'StatusUpdate'' Также Rails 4.0.2 – user1870954

+0

К сожалению, это была опечатка. Это должна быть «классная среда». Исправлена. – Hesham

+0

Не беспокойтесь! Хотя я положил это в своей модели несколько часов назад и тщательно проглотил весь мой код. Дословно, что вы написали, и я проверил с Rails API. Я все еще получаю непредвиденную ошибку tLabel в строке ассоциации has_one. Есть предположения? Нужна ли мне какая-то миграция? – user1870954

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