如何在没有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 方法或new
或 create
。在上面的例子中,类中只需要非默认的主键配置。我建议阅读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 应用程序中实现 Paypal Rest API
如何在 Rails 5 上的 ruby 中添加人脸识别?
Ruby on Rails:没有 Authlogic 的 perishable_token?