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는 .send
1.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_attribute
및 write_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
'programing tip' 카테고리의 다른 글
mysql 저장 프로 시저에 대한 기본 매개 변수를 가질 수 있습니까? (0) | 2020.11.20 |
---|---|
SSH를 통해 파일을 어떻게 편집합니까? (0) | 2020.11.20 |
알파벳의 모든 문자 배열을 생성하는 더 나은 방법 (0) | 2020.11.19 |
pydot이 Windows 8에서 GraphViz의 실행 파일을 찾을 수없는 이유는 무엇입니까? (0) | 2020.11.19 |
ng-click으로 DOM 개체에 대한 참조 전달 (0) | 2020.11.19 |