ruby-on-rails - ActiveRecord:find_by 忽略自定义 getter

标签 ruby-on-rails ruby activerecord

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/

相关文章:

ruby - 在 Ruby 中抓取/解析谷歌搜索结果

ruby - 在 Prawn 中检测新页面

mysql - 在 ActiveRecord 中使用 SQL 函数进行插入/更新

ruby-on-rails - 通过关联查询 ActiveRecord

JavaScript 到 Coffeescript

ruby-on-rails - Rails Arel 选择不同的列

mysql - ORDER BY 相关型号 rails 4

ruby-on-rails - 为什么在 Controller 中渲染时调用 current_user?

ruby-on-rails - 迁移不适用于 Heroku

ruby-on-rails - 设计通过 reset_password_token 获取用户