【问题标题】:Is there a built-in way to fetch a single ActiveRecord attribute from the database (ignoring the in-memory value)?是否有一种内置方法可以从数据库中获取单个 ActiveRecord 属性(忽略内存中的值)?
【发布时间】:2013-02-15 10:15:49
【问题描述】:

大警告:我们在我的公司使用 Rails 2。所以我正在从 ActiveRecord 2 中寻找答案(如果存在的话)。

ActiveRecord 中是否已包含一种方法来从数据库中获取属性的最新值,而无需调用 reload 或覆盖当前内存中的值?

例如:

p = Person.find(123)

# Now the in-memory value is "Joe", which would be overwritten
# if I called reload
p.nickname = "Joe"

# I want something like this to execute the equivalent of:
# SELECT 'nickname' FROM persons WHERE id = 123;
nickname_from_db = p.get_current_value(:nickname)

我意识到自己要实现的内容非常简单;如果已经有一个 ActiveRecord 方法可以满足我的要求,我只是不想重新发明轮子。

【问题讨论】:

    标签: ruby-on-rails ruby activerecord ruby-on-rails-2


    【解决方案1】:

    您可以使用select 选项。

    Person.find(123, :select => "nickname")

    【讨论】:

    • 是的,我在想这个......所以没有更多的“直接”方法,那么? (我想我只是在澄清没有,例如,包装这个的实例方法。)
    • Person.find(p, :select => :nickname)
    • 没有。 nickname 只是一个值,Rails 不知道它来自哪里。所以你必须问 thing 它来自哪里以获得当前值:Person.
    • @BenjaminM:我不是指String 上的实例方法,而是Person 上的实例方法。即,如果我有一个Person 对象p,我想也许会有一个像p.fetch_latest("nickname") 这样的方法,并且该方法会在内部调用Person.find(p.id, :select => "nickname")。无论如何,我猜没有这样的方法;所以我会按照这个答案的建议去做。
    【解决方案2】:

    您可以访问脏属性以获取该属性的先前值

    >> p = Product.first
    >> p.name # foo
    >> p.name = 'bar'
    >> p.changes['name'] # ['foo', 'bar']
    

    【讨论】:

    • 这很好,但我想获取数据库now 中当前的值,而不是我第一次获取记录时的值。这有意义吗?
    • 我不太明白。如果您需要知道数据库中现在的值,只需使用活动记录执行另一个数据库查询?!
    • @BenjaminM:当然可以;我之所以问这个问题,是因为众所周知,ActiveRecord 和 Rails 中通常有很多方便的便捷方法;因此,与其编写我自己的小辅助函数来执行此操作(如 Kaeros 的回答),我只是先检查它是否已经存在。
    猜你喜欢
    • 2011-01-13
    • 1970-01-01
    • 2010-11-17
    • 1970-01-01
    • 1970-01-01
    • 2021-07-27
    • 2011-01-03
    • 2011-07-06
    • 2013-08-22
    相关资源
    最近更新 更多