Функцией :conditions
на has_many
является фильтрация результатов, которые передаются обратно через graph_labels
, а не для защиты объектов от добавления в ассоциацию.
Если вы добавите graph_label без label_set_id, ассоциация будет построена, но если вы затем попросите graph_pane.graph_labels
, он не вернет эту графа-метку, не соответствующую условию.
Соотношение has_many/belongs_to сохраняется в модели belongs_to, graph_label, и поэтому parent/has_many/graph_pane не останавливает функцию graph_label от записи того, что она хочет для своего атрибута graph_pane_id. Эта делегация ответственности правильна, хотя и разочаровываю, я согласен.
Теперь, как остановить это, я не уверен. Похоже, вам нужна какая-то проверка в объекте graph_label, что-то вроде того, что нельзя установить graph_pane_id на graph_label, если label_set_id graph_label равен нулю. Поскольку отношение has_many/belongs_to сохраняется в графе-метке, вы должны написать валидацию на графике. Таким образом, graph_label не сможет быть сохранен с новым graph_panel_id, если он не выполнит условие.
Мысли? Вопросов?
Ссылка:
has_many
Альтернативное решение
Я перечитал свой вопрос, и я думаю, что хочу, чтобы вы хотите здесь полиморфные ассоциации.
def GraphPane < ActiveRecord::Base
has_many :label_sets
has_many :graph_labels, as: :parent
end
def LabelSet < ActiveRecord::Base
belongs_to :graph_pane
has_many :graph_labels, as: :parent
end
def GraphLabel < ActiveRecord::Base
belongs_to :parent, polymorphic: true
end
Таким образом, GraphLabel может иметь только один родитель, что и требует ваша «спецификация». Есть ли какая-то причина не осуществлять отношения таким образом?
Кстати, pjmorse, я изучал вашу организацию, Конкорд Консорциум, и обнаружил, что вы работаете с отцом, Эндрю Цукером, моего лучшего друга. Маленький мир! –