正在访问 "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_attribute
和 write_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 属性可能没问题。
有没有办法通过 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_attribute
和 write_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 属性可能没问题。