Рельсы: принадлежат к has_one - PullRequest
35 голосов
/ 23 мая 2009

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

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

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

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

Ответы [ 4 ]

19 голосов
/ 23 мая 2009

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

9 голосов
/ 23 мая 2009
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
2 голосов
/ 23 мая 2009

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

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

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

0 голосов
/ 23 мая 2009

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

...