programing tip

Rails의 열 이름 별칭

itbloger 2020. 11. 20. 08:40
반응형

Rails의 열 이름 별칭


내 데이터베이스에는 'delete'또는 'listen-control'등과 같은 열 이름이 있습니다. 이것들은 변경할 수 없으므로 내 응용 프로그램에서 문제를 피하기 위해 이름에 별칭을 지정하고 싶습니다.

다음 코드를 찾았 지만 구식 (2005 년 8 월 5 일)이고 Rails 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

열 이름의 별칭을 어떻게 지정할 수 있습니까? 가능합니까?


모델에 이것을 선언하십시오.

alias_attribute :new_column_name, :column_name_in_db

별칭 메서드 이름은 문제를 해결하지 못합니다. 위에서 언급했듯이 루비 메서드 나 변수 이름에는 대시를 사용할 수 없습니다. 루비는 "마이너스"로 해석하기 때문입니다. 그래서:

object.listen-control

루비는 다음과 같이 해석합니다.

object.listen - control

실패합니다. 찾은 코드 스 니펫은 레일 3이 아닌 루비 1.9 때문에 실패 할 수 있습니다. 루비 1.9는 .send1.8과 같이 더 이상 보호 또는 비공개 메서드 를 호출 할 수 없습니다 .

즉, 이전 데이터베이스 열 이름이별로 좋지 않아 정리하고 싶을 때가 있음을 이해합니다. lib 폴더에 "bellmyer"라는 폴더를 만듭니다. 그런 다음 "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

그리고 앨리어싱이 제대로됩니다. ActiveRecord read_attributewrite_attribute메서드를 사용하여 해당 테이블 열을 Ruby 메서드로 호출하지 않고 액세스합니다.


Jaime이 말했듯이 이러한 이름은 문제를 일으킬 수 있습니다.

이 경우에는 몇 가지 합리적인 이름을 사용하십시오. GUI는 열 이름을 지정하지 않아야합니다.

Suggestions: is_deleted or deleted_at, listen_control

Then, change your view accordingly, that's way easier than fighting ActiveRecord and your database.

참고URL : https://stackoverflow.com/questions/4014831/alias-for-column-names-in-rails

반응형