我有一个遗留数据库,其中的列名为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
问题似乎是#
。我试过像\#
那样逃避它,但我得到了同样的错误。我不明白为什么会出现语法错误,因为这种符号在其他地方对我有效。
如何让这个别名起作用?
答案 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
这应该导致相同但没有语法问题。