У меня есть работающее решение для этой клейкой ленты, но оно основано на некоторых довольно неприятных запросах, которые, боюсь, сделают приложение довольно хрупким.Ищу советы о том, как лучше реализовать следующее.
У меня есть модели для Child, ChildStatus и StatusValue.StatusValue имеет флаг «активный».Затем я хочу использовать это активное состояние, чтобы отфильтровать большинство случаев, когда я извлекаю детей из базы данных (по принципу мягкого удаления).
Модель Child, представленная ниже, отлично работает с отдельными экземплярами.Однако для извлечения данных в агрегированном виде (по крайней мере так, как я это сделал) это становится беспорядочным.
class Child < ActiveRecord::Base
...
has_many :child_statuses
has_many :status_values, :through => :child_statuses
...
def current_status
child_statuses.last
end
def status_name
if current_status
current_status.status_value.name
else
"n/a"
end
end
def status_active
current_status && current_status.status_value.active
end
end
class ChildStatus < ActiveRecord::Base
belongs_to :child
belongs_to :status_value, :foreign_key => :status_id
end
class StatusValue < ActiveRecord::Base
has_many :child_statuses
end
С учетом вышеизложенного, когда я хочу получить запрос дочерних элементов в активном состоянии, я заканчиваюс большим необработанным SQL-запросом с такими битами, как ...AND child_statuses.created_at = (SELECT MAX(created_at) FROM child_statuses WHERE child_id = children.id)
Я чувствую, что возвращаюсь к своей комфортной зоне SQL, но, вероятно, есть лучший способ сделать это.
Разве я не смогу сделать что-то вроде Child.where(:status_value.active => "TRUE")
?(Это приводит к ошибке - неопределенный метод 'active' для: status_value: Symbol)
Любые указания приветствуются.Я думал о том, чтобы изучить представление базы данных, чтобы оно тоже работало, но я не уверен, что оно поможет.