복붙노트

[RUBY-ON-RAILS] 레일의 열 이름에 대한 별칭

RUBY-ON-RAILS

레일의 열 이름에 대한 별칭

내 데이터베이스에서 등등 '삭제'또는 '들을 제어'와 같은 열 이름을 가지고있다. 나는 별명에 이름을 싶습니다 그래서 이들은 그래서 내 응용 프로그램의 회피 문제로, 변경할 수 없습니다.

나는 다음과 같은 코드를 발견하지만, (2005 8월 5일)를 오래된하고 레일 3 작동하지 않습니다 :

module Legacy
  def self.append_features(base)
    super
    base.extend(ClassMethods)
  end
  module ClassMethods
    def alias_column(options)
      options.each do |new_name, old_name|
        self.send(:define_method, new_name) { self.send(old_name) }
        self.send(:define_method, "#{new_name}=") { |value| self.send("#{old_name}=", value) }
      end
    end
  end
end

ActiveRecord::Base.class_eval do
  include Legacy
end

어떻게 열 이름을 별칭을 할 수 있습니까? 그것은 수 있습니까?

해결법

  1. ==============================

    1.모델이를 선언합니다.

    모델이를 선언합니다.

    alias_attribute :new_column_name, :column_name_in_db
    
  2. ==============================

    2.앨리어싱 방법 이름은 문제가 해결되지 않습니다. 내가 위에서 내 댓글에서 언급 한 바와 같이 루비는 "마이너스"로 해석하기 때문에, 당신은 루비 방법 또는 변수 이름에 대시를 가질 수 없습니다. 그래서:

    앨리어싱 방법 이름은 문제가 해결되지 않습니다. 내가 위에서 내 댓글에서 언급 한 바와 같이 루비는 "마이너스"로 해석하기 때문에, 당신은 루비 방법 또는 변수 이름에 대시를 가질 수 없습니다. 그래서:

    object.listen-control
    

    루비에 의해 해석됩니다

    object.listen - control
    

    그리고 실패합니다. 코드는 루비 1.9의, 아니 당신이 사용하는 1.8처럼, 더 이상 보호 또는 개인 방법에 .send 호출하지 않습니다 3. 루비 1.9 레일 때문에 실패 할 수 있습니다 발견 니펫을.

    그 존재는 내가 이전 데이터베이스 열 이름이 아주 좋은 보이지 않는 시간이있다 이해한다,했다, 당신은 그 (것)들을 정리할. "bellmyer"라는 LIB 폴더에 폴더를 만듭니다. 그런 다음 "create_alias.rb"라는 파일을 생성하고,이를 추가 :

    module Bellmyer
      module CreateAlias
        def self.included(base)
          base.extend CreateAliasMethods
        end
    
        module CreateAliasMethods
          def create_alias old_name, new_name
            define_method new_name.to_s do
              self.read_attribute old_name.to_s
            end
    
            define_method new_name.to_s + "=" do |value|
              self.write_attribute old_name.to_s, value
            end
          end
        end
      end
    end
    

    이제 앨리어싱 필요가 모델에, 당신은이 작업을 수행 할 수 있습니다 :

    class User < ActiveRecord::Base
      include Bellmyer::CreateAlias
      create_alias 'name-this', 'name_this'
    end
    

    그리고 그것은 별칭을 제대로 것이다. 루비 방법으로 그들을 호출하지 않고 그 테이블 컬럼에 액세스 할 액티브의 read_attribute 및 write_attribute 방법을 사용합니다.

  3. ==============================

    3.제이미가 말했듯이, 그 이름은 문제가 발생할 수 있습니다.

    제이미가 말했듯이, 그 이름은 문제가 발생할 수 있습니다.

    이 경우, 일부 재치있는 이름을 사용합니다. 귀하의 GUI는 열 이름을 지정하는 방법에 지시해서는 안됩니다.

    제안 : is_deleted 또는 deleted_at, listen_control

    그런 다음, 액티브 및 데이터베이스 싸움보다 훨씬 쉽게 그, 그에 따라보기를 변경합니다.

  4. from https://stackoverflow.com/questions/4014831/alias-for-column-names-in-rails by cc-by-sa and MIT license