#ruby-on-rails #model-associations
#ruby-on-rails #модель-ассоциации
Вопрос:
У меня есть класс facade, который выполняет SQL-запросы на других моделях. Я хотел использовать области видимости, но у меня возникли сомнения относительно того, где их реализовать, и лучше ли они, чем использование простых методов. Я также обеспокоен хорошей практикой программирования.
Во-первых, это мои модели
class User < ActiveRecord::Base
has_many :projects
class Project < ActiveRecord::Base
belongs_to :User
has_many :tasks, :inverse_of => :project
class Task < ActiveRecord::Base
belongs_to :project, :inverse_of => :tasks
has_many :instances
class Instance < ActiveRecord::Base
belongs_to :task
Класс фасада:
def Function1(param)
@var = @user.instances.where("...", param).order(:start_time).group_by { |x| x.method}
end
def Function2
@var = @user.instances.where("...").first
end
def Function3
@var = @user.projects.distinct
end
1) Должны ли функции 1 и 2 быть в пользовательской модели или в экземплярах?
2) Должна ли функция 3 быть в пользовательской модели или в проектах?
3) Могу ли я, например, написать «отдельную» область видимости для проектов и область видимости «Пользовательские проекты», которая вызывает проекты»?
Ответ №1:
1) Должны ли функции 1 и 2 быть в пользовательской модели или в экземплярах?
В экземплярах — вы ограничиваете область видимости возвращаемых экземпляров
2) Должна ли функция 3 быть в пользовательской модели или в проектах?
Проект — аналогично описанному выше. Пользователь по-прежнему остается пользователем, но вы будете ограничивать, какие проекты возвращаются, поэтому это область проекта
3) Могу ли я, например, написать «отдельную» область видимости для проектов и область видимости «Пользовательские проекты», которая вызывает проекты»?
Да, вы можете сделать и то, и другое, если действительно хотите — на практике, вероятно, не стоит использовать пользовательскую distinct_projects
область видимости, если вы не собираетесь повторно использовать пользовательскую distinct_projects
область видимости где-то еще (например, в другой области). Это не избавляет вас от ввода;)
Комментарии:
1. Спасибо, я удалил ‘.first’ из области видимости, сгенерированной function2