Rails中名称中带有Hashtag的别名列

时间:2017-12-21 13:15:15

标签: ruby-on-rails ruby alias sequel

我有一个遗留数据库,其中的列名为My#Column,我试图别名。在我的续集模型中,我有:

alias_attribute :MyColumn, :"My#Column"

但是我收到语法错误:

...Ruby24-x64/lib/ruby/gems/2.4.0/gems/activesupport-5.1.4/lib/active_support/core_ext/module/aliasing.rb:26: syntax error, unexpected end-of-input, expecting keyword_end

问题似乎是#。我试过像\#那样逃避它,但我得到了同样的错误。我不明白为什么会出现语法错误,因为这种符号在其他地方对我有效。

如何让这个别名起作用?

1 个答案:

答案 0 :(得分:2)

这是[XmlElement]实际正在做的Source

[XmlRoot("REPORTLIST")]
public class ReportList
{
    [XmlElement("ROW")]
    public List<Row> Rows { get; } = new List<Row>();    
}
public class Row
{
    [XmlElement("INSTNUMBER")]
    public string InstNumber { get; set; }
    [XmlElement("MATERIAL")]
    public string Material { get; set; }
}

所以基本上这就是

alias_attribute

请注意,这是一行,这意味着 module_eval <<-STR, __FILE__, __LINE__ + 1 def #{new_name}; self.#{old_name}; end # def subject; self.title; end def #{new_name}?; self.#{old_name}?; end # def subject?; self.title?; end def #{new_name}=(v); self.#{old_name} = v; end # def subject=(v); self.title = v; end STR 之后的所有内容都会成为评论(包括 def MyColumn; self.My#Column; end def MyColumn?; self.My#Column?; end def MyColumn=(val); self.My#Column= val; end ),从而导致您收到的错误。即使这不是self.My end中的单行,也只会因rails不是方法而提出ruby,因为NoMethodError部分会被视为评论。

这似乎很奇怪,因为My具有完全相同的功能实现define_proxy_call看起来像

#Column

在这里你可以看到它实际上检查新名称(ActiveModel#alias_attribute)和原始名称(def define_proxy_call(include_private, mod, name, send, *extra) defn = if NAME_COMPILABLE_REGEXP.match?(name) "def #{name}(*args)" else "define_method(:'#{name}') do |*args|" end extra = (extra.map!(&:inspect) << "*args").join(", ".freeze) target = if CALL_COMPILABLE_REGEXP.match?(send) "#{"self." unless include_private}#{send}(#{extra})" else "send(:'#{send}', #{extra})" end mod.module_eval <<-RUBY, __FILE__, __LINE__ + 1 #{defn} #{target} end RUBY end )是否“可编辑”,如果不是,它会适当地处理它们。

而不是name哪个与本质上是评论字符有问题。我建议使用send手动执行相同操作。

alias_attribute

这应该导致相同但没有语法问题。