2017-12-21 1 views
0

별칭을 지정하려는 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

이 실제로 그래서 기본적으로는이이 self.My 후 모든 코멘트를하게한다는 것을 의미 한 줄에 있다는 사실

def MyColumn; self.My#Column; end 
    def MyColumn?; self.My#Column?; end 
    def MyColumn=(val); self.My#Column= val; end 

공지되고

Source

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 
을 무엇을하고 있는지 alias_attribute입니다 ( end 포함) 오류가 발생합니다. rails ruby의 단일 행이 아니더라도 #Column 부분을 주석으로 처리하기 때문에 My이 메소드가 아니므로 간단히 NoMethodError을 발생시킵니다.

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 

처럼 보이는 define_proxy_call를 통해 동일한의 기능 구현이 당신이 실제로 확인합니다 볼 수 있기 때문에 이것은 또한 이상한 것 같다 경우 새 이름 (name)과 원래 이름 (send)는 "준수 가능"하며 적합하지 않으면 적합합니다.

alias_attribute보다는 본질적으로 주석 문자와 관련된 문제가 있습니다. public_send을 사용하여 수동으로 구현하는 것이 좋습니다.

def MyColumn 
    self.public_send("My#Column") 
    end 
    def MyColumn=(val) 
    self.public_send("My#Column=",val) 
    end 
    def MyColumn? 
    self.public_send("My#Column?") 
    end 

결과는 동일하지만 구문 문제는 발생하지 않습니다.

+0

설명해 주셔서 감사합니다. 나는 한두 가지를 배웠다. 그리고 효과가있었습니다. 건배! – JosephGage

관련 문제