2013-09-10 5 views
0

Я работаю над приложением Rails 3.0.x (на самом деле это Hobo 1.3.x, но это не относится к этому вопросу). Среди моделей есть GraphPanes, GraphLabels и LabelSets. GraphPane может иметь GraphLabels и LabelSets. GraphLabels могут принадлежать GraphPanes или LabelSets, но не оба. Поэтому, если GraphLabel принадлежит к LabelSet, я бы хотел, чтобы он не ассоциировался с GraphPane.has_many association игнорирует ограничивающее условие

Я пытаюсь применять, что с помощью этого кода в модели GraphPane:

has_many :graph_labels, :conditions => 'label_set_id = NULL' 

Однако, я все еще в состоянии связать GraphLabels с не-нулевой label_set_id с GraphPanes. Зачем? Как я могу остановить это?

This question внешне похож, но мои отношения не являются полиморфными, поэтому номинальное решение там мне не помогает.

+1

Кстати, pjmorse, я изучал вашу организацию, Конкорд Консорциум, и обнаружил, что вы работаете с отцом, Эндрю Цукером, моего лучшего друга. Маленький мир! –

ответ

1

Функцией :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 может иметь только один родитель, что и требует ваша «спецификация». Есть ли какая-то причина не осуществлять отношения таким образом?

+0

Эй, это интересно. Я не думал об использовании полиморфного отношения таким образом. – pjmorse

Смежные вопросы