2016-10-21 1 views
0

Я создаю приложение non-Rails и использую DataMapper как ORM.Должен ли я использовать объекты DataMapper только для целей сохранения?

Для объектов, которые будут сопоставлены с таблицами SQL, я объявляю классы, которые включают DataMapper :: Resource.

Вопрос есть. Можно ли использовать экземпляры этих классов как простые объекты (перейти к методам, манипулировать значениями и т. Д.)? Или они должны использоваться только для сохранения данных (например, в классах репозитория)?

Я новичок в мире Ruby и не знаю конвенций. Если у меня есть пользовательский объект, который создает методы, все и т. Д., Это хорошая идея создать другой пользователь класса, который будет хранить информацию только (будет иметь поля состояния и никакие методы)? Аналог POJO (Обычный объект Java Java) в Java?

+0

Это зависит. Для чего вы использовали эти ПОРО? –

+0

Например, для хранения информации, полученной от пользователя. Сохранение в сеансе. И т. Д. (Различные виды операций с сохранением базы данных) – RhinoLarva

ответ

0

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

Для типичного использования DataMapper или ActiveRecord я не думаю, что для создания классов-оболочек для списков простых объектов обычно не принято, особенно если вы не добавляете какие-либо методы в коллекцию. Основная причина, по которой это не распространено, - это то, что результаты запроса в ActiveRecord или DataMapper уже похожи на массивы. Кроме того, вы не получаете каких-либо дополнительных функций, преобразовывая экземпляры модели в хэши. Позвольте мне показать несколько примеров:

# collections are array-like 
User.all.map(&:name) == User.all.to_a.map(&:name) 

# converting a record to a hash doesn't add much 
user = User.first 
user_hash = user.attributes 
user.name == user_hash[:name] 

Это, как говорится, есть один нюанс, и что должен делать с змеевидных методов в ОРМ:

# this is valid chaining 
User.all.where(name: "max") 

# this raises a NoMethodError for 'where' 
User.all.to_a.where(name: "max") 

where является метод ORM, а не массив метод. Поэтому, если вы преобразуете результат запроса в массив, вы не сможете получить к нему доступ. По этой причине полезно провести различие между массивами и наборами запросов.

Но сколько выгоды вы получаете от создания пустого класса-оболочки?

class RecordsInMemory 
    def initialize(query_collection) 
    @list = query_collection.map(&:attributes) 
    end 
end 
records_in_memory = RecordsInMemory.new(User.all) 
records_in_memory.list.map(&:name) 

# versus ... 

records_in_memory = User.all.map(&:attributes) 
records_in_memory.map(&:name) 

Если вы думаете, что в конечном итоге вы добавите методы в список простых объектов, вы должны сделать это в классе. Но в остальном я думаю, что использование явно названных переменных достаточно.