Проблема в том, что probability
, по крайней мере, в данном определении моделей, не является атрибутом Pathogen
, и вы хотите получить к нему доступ, как если бы это было.
Попытка сделать что-то вроде d.pathogens << Pathogen.create(:name => "xx", :probability => 0.12)
обычно не очень хорошая идея, потому что вы объединяете идею объекта DiseasePathogen
в объект Pathogen
. Либо эти две концепции являются достаточно отдельными, чтобы заслужить свои собственные классы моделей, либо это не так.
Если заболевания и патогенные микроорганизмы не имеют присущей им вероятности, то связь между ними явно важна сама по себе. Код будет отражать, что:
d = Disease.first
p = Pathogen.create(:name => 'xx')
l = DiseasePathogen.create(:disease => d, :pathogen => p, :probability => 0.12)
Последняя строка вашего идеального интерфейса имеет похожую проблему, но исправление немного сложнее.
Когда вы говорите d.pathogens[0]
, вы имеете в виду не отношение, а только конкретный объект Pathogen
, который может принадлежать любому числу Disease
объектов. Этот голый объект не может знать, на какую ссылку вы ссылаетесь. В этом весь смысл DiseasePathogen
объектов.
Использование d.disease_pathogens[0].probability
будет работать так, как вы хотели. В противном случае вы можете создать вспомогательную функцию в основных классах, которая предоставит хороший псевдоним этой функциональности.
Суть в том, что когда вы хотите сослаться на данные, хранящиеся в определенном объекте (в данном случае объект, связывающий два других объекта), вам необходимо как-то однозначно указать этот объект. Если вы не хотите этого делать, вам придется поместить нужные данные в один из других объектов.
Лучший способ, которым я могу придумать для имитации желаемого интерфейса, - это пользовательская функция в Disease
и Pathogen
, которая принимает объект дополнительного класса и ищет желаемую вероятность.