У меня есть таблица jobs
и таблица activities
. У одного задания может быть много действий. Отношение является полиморфным.Как запросить полиморфные отношения
Таблицы:
job activities
----------- -------------
id id
... target_id
target_type
...
модели псевдо-код:
class Job < ActiveRecord::Base
# ...
has_many :activities, :as => :target, :dependent => :delete_all
# ...
end
class Activity < ActiveRecord::Base
# ...
belongs_to :target, :polymorphic => true
# ...
end
состояние данного задания определяется состоянием последней деятельности это относится к, как показано ниже (последняя в этот случай является последним, поэтому мы можем безопасно заказать по id).
Job +-> Activity 1 - state: new |
+-> Activity 2 - state: submitted +--> Job state is approved
`-> Activity 3 - state: approved |
Как бы вы запрашиваете только те задания, которые на данном состоянии, с помощью ActiveRecord и Rails 3/4?
Он также (просто) придумал мне идею вместо того, чтобы делать этот запрос в целом, использовать что-то вроде «counter caches», используя и денормализовать отношения. Я бы сохранил состояние в таблице рабочих мест и поддерживал его синхронизацию с помощью after_create
крюка на модели Activity
? Что-то в этом отношении:
after_create :update_state
def update_state
target.update_attribute(state: self.state) if target.respond_to?(:state)
end
Будет ли это жизнеспособной альтернативой для решения проблемы более простым способом?
Я думаю, что у вас уже есть самые простые решения.Я бы пошел со вторым методом, потому что проверка работы с определенными состояниями займет много времени. –
вы можете попробовать использовать http://api.rubyonrails.org/classes/ActiveRecord/SpawnMethods.html#method-i-merge –