Правильное размещение области

#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