В некоторых случаях вы можете не захотеть добавлять определенное поле в таблицу. В вашем примере вам действительно нужна только одна таблица, поскольку вы можете просто добавить account_number
и credit_ranking
к таблице suppliers
. Но иногда полезно хранить данные в нескольких таблицах. Затем вы должны использовать отношение has_one
(один-к-одному).
В вашем примере вы также можете просто добавить атрибут supplier_id
к account_histories
и заменить has_one :account_history, :through account
просто has_one :account_history
, но это будет избыточно и также усложнит ваш код, так как вам нужно убедиться, что вы делаете не меняйте один атрибут и не забудьте обновить другой.
UPDATE:
Если вы не добавите атрибут supplier_id
к account_histories
, тогда Rails не сможет определить, какая строка из этой таблицы принадлежит какому поставщику. Единственный способ выяснить это - посмотреть в соответствующей таблице accounts
. Без accounts
вы не сможете определить, какой account_history
принадлежит поставщику, так как в таблице accounts_histories
нет внешних ключей для таблицы suppliers
.
Чтобы получить account_history
для поставщика без опции :through
, вам нужно будет сделать это:
Supplier.find(id).account.account_history
:through
позволяет заменить его следующим:
Supplier.find(id).account_history
Как вы написали в своем обновлении, вы можете добавить атрибут credit_ranking
к accounts
и иметь только две таблицы. Это было бы еще проще, но вы можете просто не сохранять этот атрибут в той же таблице (потому что, возможно, у вас уже есть много других атрибутов и вы не хотите добавлять их еще больше).