如何在没有rails的ruby中实现Application Record

Posted

技术标签:

【中文标题】如何在没有rails的ruby中实现Application Record【英文标题】:How to implement Application Record in ruby without rails 【发布时间】:2022-01-14 00:06:00 【问题描述】:

我一直在查看这个存储库 https://github.com/stungeye/ActiveRecord-without-Rails 了解如何在没有rails 的情况下实现activerecord。我遇到了一些问题。起初我在尝试运行这个类时遇到了这个错误:

require 'active_record'

ActiveRecord::Base.establish_connection(adapter: 'mysql2', database: 'rbuserroom')

# Can override table name and primary key
class User < ActiveRecord::Base
    self.primary_key = 'user_id'

    def initialize(id, email)
        @user_id = id
        @user_email = email
        @user_room

    end

    def create()
        self.save
    end
    
    # accessor get and set method
    attr_accessor :user_room
    attr_reader :user_id, :user_email
end

usr = User.new(1, "user@user")
usr.create()

但我收到了这个错误:

Traceback (most recent call last):
    1: from -:25:in `<main>'
/home/felipe/.rbenv/versions/2.7.5/lib/ruby/gems/2.7.0/gems/activerecord-6.1.4.1/lib/active_record/inheritance.rb:52:in `new': wrong number of arguments (given 2, expected 0..1) (ArgumentError)

似乎活动记录在创建类时不接受参数,实际上在那之后我注意到这个示例中的类不包含任何内容,活动记录如何定义表的列?

我习惯了 java jpa 和 springboot,我必须定义类的所有属性。 此外,我不知道活动记录是否真的有效。 我只希望当我使用我的用户类创建一个新用户时,信息作为插入保存在数据库中,或者当我更改我的对象属性值时它会更新。

【问题讨论】:

即使你只使用 ActiveRecord 而没有 Rails 的其他部分,你仍然需要遵循 ActiveRecord 文档。这意味着您通常不必实现 getter 和 setter 方法或 newcreate。在上面的例子中,类中只需要非默认的主键配置。我建议阅读guides.rubyonrails.org/active_record_basics.html 【参考方案1】:

使用 ActiveRecord,您无需指定列名。它从数据库中检测到它们。

你可以写:

require 'active_record'

ActiveRecord::Base.establish_connection(adapter: 'mysql2', database: 'rbuserroom')

class User < ActiveRecord::Base
  self.primary_key = 'user_id'
end

usr = User.create(user_id: 1, user_email: "user@user")

您可以在docs 中阅读有关创建模型的更多信息。尤其是3 Creating Active Record Models

【讨论】:

您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center。 Nicolas 当然正确地指出 active_record 为您完成了大部分数据库工作。所以不需要自己定义初始化或创建或访问器。但我认为错误消息是由于数据库主键是自动设置的,您可能没有明确设置。 在这种情况下,我必须先创建我的数据库结构,对吧? @Atastor 谢谢你的提示。我添加了一些链接。该错误不是由主键引起的。如果需要,可以手动设置。问题是ActiveRecord::Base 覆盖了new 方法并且具有与initialize 不同的参数。它只需要没有参数或单个哈希。 @FelipeCristiano 完全正确。这通常通过使用migrations 来完成。或者,您可以手动创建它们。

以上是关于如何在没有rails的ruby中实现Application Record的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Rails 中实现无限滚动

如何在 Rails 应用程序中实现 Paypal Rest API

如何在 Rails 5 上的 ruby​​ 中添加人脸识别?

Ruby on Rails:没有 Authlogic 的 perishable_token?

如何使用 Ruby on Rails 发出 HTTP 请求?

如何使用 Ruby on Rails 发出 HTTP 请求?