正在访问 "real_field_non_translated"? - 机动性

Accessing "real_field_non_translated"? - Mobility

有没有办法通过 ActiveRecord 访问 "real_field"(比方说)?

例如。如果我有一家 Model Company 并执行 Company.create(name: "My Company Name")(使用 I18n.locale = :en),该名称值将不会保存在公司记录中,但会保存在字符串的移动性 table 中。

这样做 Company.last 将 return

#<Company id: 5, name: nil>

但是 Company.last.name 将 return 我的公司名称(假设区域设置正确)

有没有办法像 Company.last.real_name 那样给我记录的实际值?在这种情况下为零。我也想要一个real_name=.

mobility (0.4.2) i18n (>= 0.6.10, < 0.10) request_store (~> 1.0)

Backend: key_value

试试这个:

Company.last.read_attribute :name

或者这样:

Company.last.name_before_type_cast

接受的答案是正确的,作为任何 ActiveRecord 模型的一般方法:read_attributewrite_attribute 将始终获取和设置列值,而不管模型中定义的任何覆盖。正如我评论的那样,这些方法也有缩写:

company[:name]         #=> returns the value of the name column
company[:name] = "foo" #=> sets the value of the name column to "foo"

此外,特别是在 Mobility 中,有一个选项可以传递给 getter(和 setter),它将跳过任何 Mobility 会通常为属性做:

company.name(super: true) # skips Mobility and goes to its parent (super) method,
                          # which would typically be the column value.

如果您可能正在使用另一种 gem 也对属性做一些特殊的事情,这种方法可能会更好。

还有一个 setter 选项,但是使用起来有点棘手:

company.send(:name=, "foo", super: true) # sets name to "foo", skipping Mobility

如果您将 Mobility 与覆盖属性 getters and/or setters 的另一个 gem 一起使用,那么 super 选项可能会有用;否则 read/write 属性可能没问题。