【问题标题】:Rails 4 - Generic alias_attributeRails 4 - 通用别名属性
【发布时间】:2018-04-06 21:59:55
【问题描述】:

我正在尝试为某些模型属性创建通用 alias_attribute。

由于我需要在数据库中保留字段的原始名称,因此我希望使属性更具可读性。

例如:GenericDataBaseColumn #=> generic_data_base_column

到目前为止,这是我所拥有的,但没有按预期工作:

self.attribute_names.
    each { |attr| alias_attribute attr.split(/(?=[A-Z])/).
                   join("_").downcase.to_sym, :attr }

我正在使用alias_attribute,因为我正在使用一些字段,我将它们作为 JSON 接收并对其进行序列化,因此我希望通过仅进行迁移来保持将来更改它们的可能性。

我问这个是因为我已经研究过了,唯一类似的问题是仍然没有回答。

How to create dynamic attribute aliases in rails?

我仍然不确定这是否可能实现。

谢谢

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-4 activerecord metaprogramming alias


    【解决方案1】:

    显然看起来是对我应该如何调用属性的误解。 而不是self.attribute_names 应该是attribute_names,因为该方法应该只为实例化的元素调用。

    另外,在第一次修复之后,我不得不跳过所有同名的属性,因为这会导致SystemStackError (stack level too deep)

    最终的实现应该是这样的:

    # Defining alias attributes
    attribute_names.each do |attr|
      next if attr.blank? || (attr == attr.underscore)
      alias_attribute attr.underscore.to_sym, attr.to_sym
    end
    

    希望这对其他人有所帮助。 另外,如果有人有答案,请随时发布。谢谢

    【讨论】:

    • 不错的解决方案。我已将其添加到我的应用程序中 - 该应用程序使用的是带有 CamelCase 名称的旧数据库。我有一个 ApplicationRecord 的子类,我在 after_initialize 中添加了这段代码。因为我是在记录(而不是模型)的上下文中执行此操作,所以我使用 self.class.alias_attribute 而不是 alias_attribute
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-03
    • 1970-01-01
    • 1970-01-01
    • 2023-03-15
    相关资源
    最近更新 更多