【发布时间】:2014-02-15 03:27:26
【问题描述】:
假设我们有这个模型
class Account < ActiveRecord::Base
after_initialize :set_name
def set_name
self.name = ‘My Account’
end
end
现在我想运行一个查询,它只返回模型的一些属性而不是全部,特别是不返回它在 after_initialize 回调中使用的“名称”属性
Account.group(:name).select("count(*), id").first
然后此执行引发以下错误,因为 set_name 回调使用的属性尚未“加载”或未选择到查询返回的记录中。
ActiveModel::MissingAttributeError: missing attribute: name
幸运的是,对于某些特定情况,我可以执行相同的 sql 查询,而完全不使用 Account 模型来获得所需的结果
sql = Account.group(:name).select("count(*), id").to_sql
ActiveRecord::Base.connection.execute(sql).first
=> #<Mysql2::Result:0x00000106eddbc0>
但重点是,如果我想获取 Account 对象而不是 Mysql2::Result 对象怎么办? .select 方法是否应该返回具有所有属性的“完整”对象(例如,用 Nil 填充缺失的列)?或者对我们的 ActiveRecord 模型使用 after_initialize 回调是一个非常糟糕的主意?当然,我们也可以在回调中添加一些代码来检查属性是否存在,但在我看来,这在 OO 语言中是不自然的或听起来很奇怪。
【问题讨论】:
-
请仔细阅读这个问题,因为它不是那么简单,我相信答案不是那么简单。让我知道你的想法。
标签: sql ruby-on-rails ruby-on-rails-3 activerecord callback