Подтвердить что ты не робот

Rails: принадлежит_to vs has_one

Немного нового вопроса о ассоциациях рельсов.

У меня есть модель ошибок и модель состояния. Статус - это просто таблица пар ключ/значение. Из доступных вариантов я бы сказал, что Bug has_one Status имеет наибольший смысл. Однако, согласно this

Содержимое принадлежит_контенту. Идти назад и посмотрим, как я описал проблема, и вы увидите, что она работает. С помощью belongs_to таблица принимает ответственность за внешний ключ. Так Содержимое имеет content_template_id. А также ContentTemplate ничего не требует. Я могу указать на это по своему усмотрению. Готово.

Bug принадлежит_to Статус будет более подходящим (так как Bug должен взять внешний ключ). Семантически, его пример имеет смысл, но мой не делает ничего. Это просто причуда рельсов, где в этой ситуации это выглядит странно, или я не понимаю что-то/делаю это неправильно?

4b9b3361

Ответ 1

Да, я думаю, вы только что нашли в Rails несколько странный сценарий. Полагаю, было бы полезно рассматривать "статус" как своего рода категорию, к которой относится ошибка - в этом свете это имеет смысл.

Ответ 2

TABLE:
    Bug
    id integer
    desc string
    status_id integer fk

    Status
    id integer
    desc string

RAILS MODEL:
    Bug
    belongs_to :status

    Status
    has_many :bugs

Ответ 3

Вы точно не объяснили, какие отношения между Bug и Status вы хотели бы получить, но я предполагаю, что вас интересует одно из следующих:

  • один-ко-многим: в этом случае в классе Bug и belongs_to в классе Status должно быть has_many,
  • один-к-одному: в этом случае в классе Bug и belongs_to в классе Status должен быть has_one.

В обоих случаях статус содержит внешний ключ. Во втором случае формулировка немного странная, из-за того, что взаимно однозначное отношение фактически асимметрично (должен быть только FK только с одной стороны).

Ответ 4

Если Status является только таблицей поиска/ключевого значения, похоже, что вы хотите habtm (has_and_belongs_to_many) отношения между статусом и ошибкой. С помощью habtm в итоге вы получите таблицу соединений bugs_statuses, в которой есть столбцы bug_id и status_id, а также ваши таблицы ошибок и статусов.