Должны ли методы модели всегда возвращать модели своего собственного типа? - PullRequest
1 голос
/ 28 июня 2011

Для методов моделей, которые возвращают модели или коллекции моделей, должны ли эти методы возвращать только модели типа, соответствующего классу, в котором они живут?

Например, если у меня есть модель Theatre, должны ли ее методы всегда возвращать модели типа Theatre, или когда-нибудь имеет смысл возвращать модели типа Showtime (например, Theater.get_showtimes (theatre_id) против Showtimes.get_by_theater_id ( theater_id)).

Ответы [ 4 ]

2 голосов
/ 28 июня 2011

Я задавал себе этот вопрос почти каждый раз, когда сталкиваюсь с такими же ситуациями, как ваша. Я лично стараюсь придерживаться модели, возвращающей свой собственный тип. Так что в этой ситуации я бы пошел с Showtimes.get_by_theater_id(theater_id). Это имеет больше смысла, когда я смотрю на код позже.

1 голос
/ 28 июня 2011

Несколько других способов реализации вашего примера в стиле ActiveRecord (Theater.get_showtimes(theater_id)):

  • Theater.find(theater_id).showtimes вместо. Предполагается, что вы использовали ассоциации ActiveRecord, как упоминает zsalzbank.
  • Showtimes.find_by_theater_id(theater_id)

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

Теперь, если мы говорим исключительно о теории, я бы поспорил о соблюдении соглашений языка и / или структуры, которую вы используете.

Глядя на ActiveRecord::Base (http://apidock.com/rails/ActiveRecord/Base), тривиально найти группу методов класса, которые возвращают что-то не ActiveRecord::Base. Например, ActiveRecord::Base.connection возвращает подкласс ActiveRecord::ConnectionAdapters::AbstractAdapter, а ActiveRecord::Base.table_name возвращает String. Очевидно, что ваша модель также имеет эти методы, поэтому она возвращает эти значения.

Я не вижу никакой пользы от наложения предложенного ограничения на себя / свой код - тем более что вы уже нарушили правило, унаследовав от ActiveRecord::Base и в любом случае придется иметь дело с различными классами возврата.

1 голос
/ 28 июня 2011

Если ваш Theater has_many Showtimes, то вы можете получить к нему доступ Theater.Showtimes.

0 голосов
/ 28 июня 2011

Краткий ответ: нет.

Модель - это просто файл класса ruby, который представляет собой некоторую таблицу в базе данных и в действительности используется только в мире ruby-on-rails.Модель ничего не возвращает, это просто контейнер.Модель имеет методы / функции, которые возвращают данные, и они ни в коем случае не должны возвращать только один и тот же объект модели.

Например (псевдокод):

class Dog < AR:B

  def hack_the_world
    //do hacking and return array of passwords
    //...
  end

end

У нас есть собакамодель здесь.Например, мы получаем эти методы из rails, которые возвращают объекты Dog:

dogs=Dog.all
dog=Dog.find(1)
dog=Dog.where(:name => 'fido')

Но тогда мы можем вызвать наш метод, который не возвращает никаких объектов Dog

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