【问题标题】:How to define a class in Ruby when using Sequel?使用 Sequel 时如何在 Ruby 中定义一个类?
【发布时间】:2014-05-01 03:15:52
【问题描述】:

我将 Ruby 与 Sinatra 和 Sequel 一起使用。现在我正在尝试为我的项目创建类,例如应该包含“First Name”和“Lastname”的类“User”。创建该类的实例时,应该可以直接设置名称,如new User("Some","name")。 我正在使用 Sequel 连接到数据库并像这样创建一个 class::model:

class User < Sequel::Model end

我现在的问题是我应该在哪里为我的类 User 添加一个构造函数并定义所有变量?因为我已经有了 Sequel::Model "User" 我无法创建另一个类 "User" 但另一方面我可以不向 Sequel::Model 类添加构造函数,因为这将为每个实例创建一个新数据集用户类,不是吗?我很困惑。

如果这里的简短版本有点难以理解:我有一个文件,其中包含一个继承 Sequel::Model 的类“用户”。我应该将类变量(如 name 或 id)和方法(如“do_something_with_a_specific_user()”)放在哪里?

【问题讨论】:

    标签: ruby sinatra sequel


    【解决方案1】:

    我应该将类变量(如 name 或 id)和方法(如……)放在哪里?

    对于表中的属性,您不需要。加载数据库时,将使用从数据库中的users 表推断的信息构建User 类。如果您有一个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"
    

    【讨论】:

    • 感谢您的评论。我还是不明白我应该把适用于用户的方法放在哪里?进入用户类或其他地方? “通常的方式”是什么意思?想象一下,我想为我拥有的每个用户创建一个 User 类的实例,我不能只使用 User.new 创建新用户,因为这样每次都会创建新数据集...
    • @phpheini 你是 Ruby 新手吗?如果是这样,我建议您在使用 Sequel之前快速了解如何创建标准类。
    • 是的,我是新手,我看过这个rubylearning.com/satishtalim/writing_our_own_class_in_ruby.html,但这并不能回答我的问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-14
    • 1970-01-01
    相关资源
    最近更新 更多