Лучший способ использовать эквивалент представления базы данных в рельсах? - PullRequest
0 голосов
/ 03 августа 2011

У меня есть работающее решение для этой клейкой ленты, но оно основано на некоторых довольно неприятных запросах, которые, боюсь, сделают приложение довольно хрупким.Ищу советы о том, как лучше реализовать следующее.

У меня есть модели для 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)

Любые указания приветствуются.Я думал о том, чтобы изучить представление базы данных, чтобы оно тоже работало, но я не уверен, что оно поможет.

Ответы [ 2 ]

3 голосов
/ 03 августа 2011

Вы можете создать представление базы данных (используйте execute "CREATE VIEW my_view AS..." в своей миграции) и указать модель ActiveRecord на нее, а не на таблицу.

class MyView < ActiveRecord::Base
  def readonly?
    true
  end
end
0 голосов
/ 03 августа 2011

Вы пробовали Child.includes(:status_values).where('status_values.active = true')?

Отказ от ответственности: Я не понимаю разницу между Child.joins() и Child.includes().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...