Как определить класс в Ruby при использовании Sequel?

Я использую Ruby с Sinatra и Sequel. Теперь я пытаюсь создать классы для своего проекта, например, класс «Пользователь», который должен содержать «Имя» и «Фамилия». При создании экземпляра этого класса должна быть возможность напрямую устанавливать имена, такие как new User("Some","name"). Я использую Sequel для подключения к базе данных и создания class::model следующим образом:

class User < Sequel::Model end

Теперь мой вопрос: где мне добавить конструктор для моего класса User и определить все переменные? Поскольку у меня уже есть Sequel::Model "User", я не могу создать другой класс "User", но с другой стороны я не могу добавить конструктор в класс Sequel::Model, потому что это создаст новый набор данных для каждого экземпляра класс User, не так ли? Я запутался.

Если это было немного сложно понять, вот короткая версия: у меня есть файл, содержащий класс «Пользователь», который наследует Sequel::Model. Где бы я разместил переменные класса, такие как имя или идентификатор, и методы, такие как «do_something_with_a_specific_user()»?


person Chris    schedule 23.03.2014    source источник


Ответы (1)


Куда бы я поместил переменные класса, такие как имя или идентификатор, и методы, такие как…

Для атрибутов, которые есть в таблице, вы этого не сделаете. Когда база данных загружена, класс User будет создан с использованием информации, полученной из таблицы users в базе данных. Если у вас есть поле id, то экземпляры модели получат атрибут id и т. д. Если вам нужны дополнительные атрибуты, которых нет в таблице, просто добавьте их обычным способом. То же самое касается методов.

Кроме того, синтаксис, который вы будете использовать для создания нового экземпляра модели, будет больше похож на user = User.new name: "php", lastname: "heini"

См. http://sequel.jeremyevans.net/rdoc/files/README_rdoc.html#label-Sequel+Models


Будьте осторожны со словом «создать», когда говорите о моделях, потому что есть создание записи в базе данных и создание экземпляра, но большинство людей ожидает, что «создать» будет относиться к первому, а не (только) к последнему. new — хороший синоним слова «создать», следовательно, он ведет к новой записи в базе данных (если вы save ее, в противном случае просто используйте create). Если вы хотите получить экземпляр (то есть запись), то либо захватите экземпляр при вызове new, либо извлеките существующую запись. Существует множество способов извлечения записей, но [] вы будете часто использовать. Это имеет смысл как выбор, поскольку массивы и хэши также используют этот синтаксис для поиска записей.

class User < Sequel::Model

  def fullname
    "#{self.firstname} #{self.lastname}"
  end
end

# add your first user
u1 = User.new firstname: "Bill", lastname: "Flowerpot"

u1.fullname
# => "Bill Flowerpot"

u1.save

u1.id
# => 1

# retrieve it later by index
u1 = User[1]

# Retrieve a user (that has already been added to the db)
# by some other unique value
u2 => User[firstname: "Ben"]
u2.fullname
# => "Ben Flowerpot"
person iain    schedule 25.03.2014
comment
Спасибо за ваш комментарий. Я просто до сих пор не понимаю, куда мне помещать методы, применимые к пользователю? В класс User или куда-то еще? И что вы подразумеваете под обычным способом? Представьте, что я хотел бы иметь экземпляр моего класса User для каждого пользователя, который у меня есть, я не мог бы просто создавать новых пользователей с помощью User.new, потому что это каждый раз создавало бы новые наборы данных... - person Chris; 25.03.2014
comment
@phpheini Вы новичок в Ruby? Если это так, я предлагаю вам взглянуть на то, как создать стандартный класс до работы с Sequel. - person iain; 25.03.2014
comment
да, я новичок, я просмотрел этот rubylearning.com/satishtalim/writing_our_own_class_in_ruby.html, но это не отвечает на мой вопрос. - person Chris; 25.03.2014