ActiveRecord имеет отношение has_one и has_many с одинаковым: foreign_key - PullRequest
2 голосов
/ 10 декабря 2011

У меня есть две модели, Story и Chapter. * Рассказ has_many главы, одной из которых является глава, которая служит его первой главой. Раньше у меня был внешний ключ start_id в таблице историй, чтобы указать, какая глава является первой. Однако, схему базы данных пришлось немного изменить, теперь у каждой главы есть code. Если код '1a', то это первая глава истории, которой принадлежит эта глава.

Кажется, работает следующее, включая #create_start:

has_many :chapters, :dependent => :destroy, :inverse_of => :story
has_one :start, :class_name => 'Chapter', :foreign_key => 'story_id', :conditions => {:code => '1a'}

Таким образом, внешний ключ start_id таблицы историй не нужен, и #start по-прежнему остается ассоциацией со всеми преимуществами (мне нужна #start в качестве ассоциации, потому что я использую CanCan с ассоциациями для авторизации).

Есть ли у моего подхода какие-либо недостатки, которые я в настоящее время не могу осознать, или я относительно безопасен с ним?

1 Ответ

2 голосов
/ 11 декабря 2011

Полагаться на код == '1a', чтобы найти первую главу, немного сложно.Вероятно, я бы добавил флаг к таблице глав, например, first_chapter или что-то, что было истинным или ложным, указывая, была ли это первая глава.Таким образом, first_chapter-ness главы может пережить изменение поля кода, но это немного придирчиво.

Кроме того, чтобы не повторяться, вы можете изменить объявление has_one: start на что-то вроде:

has_one :start, :through => :chapters, :conditions => { :code => '1a' }
...