ActiveRecord 的 find_by
方法似乎没有注意到自定义 getter。也就是说,find_by
似乎查看的是实际存储在数据库中的值,而不是 getter 返回的内容。示例:
ActiveRecord::Base.establish_connection("sqlite3::memory:")
ActiveRecord::Schema.define do
create_table(:users) { |t| t.string "name" }
end
class User < ActiveRecord::Base
def name; self["name"] || "default" end
end
User.create({ "name" => "foo" })
User.create()
p User.find_by("name" => "foo")
p User.find_by("name" => "default")
p User.last.name
这打印:
#<User id: 1, name: "foo">
nil
"default"
我本以为第二行不是nil
,而是显示添加的第二条记录。我所看到的可能是 find_by
的预期行为(我不知道)。但是,我可以使用什么方法来代替 find_by
,后者将使用 getter 返回的值?
最佳答案
ActiveRecord 是数据库 的接口(interface) - 所有查询都转换为 SQL。 User.find_by("name"=> "foo")
执行 SELECT * FROM users WHERE name = 'foo'
,然后将结果包装在 Ruby User
对象。
您的数据库不知道 setter/getter 。要使用 getter,您必须首先拥有一个 Ruby 对象 - 这意味着您需要从表中检索所有 对象,然后使用 .select
过滤结果 ruby 。
关于ruby-on-rails - ActiveRecord:find_by 忽略自定义 getter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57690307/