'유효한'이라는 열이있는 데이터베이스에서 activeRecord를 어떻게 사용하려면 어떻게해야합니까? (DangerousAttributeRor)
-
19-09-2019 - |
문제
변경할 수없는 데이터베이스에 액세스하고 있으며 열이라는 열이 있습니다. 유효한 한정된. 속성에 액세스하려고 할 때 마다이 예외가 발생합니다.
유효한? ActiveRecord (ActivereCord :: DangerousAttributeError)에 의해 정의됩니다.
예외는 의미가 있지만 데이터베이스를 변경할 수 없으므로 어떻게이 오류를 해결할 수 있습니까?
속성을 "재정의"시도했지만 원래 열을 제거하는 방법을 모르겠습니다. 이 valid_column 메소드를 성공적으로 호출 할 수 있지만 데이터베이스에 정의 된 다른 속성에 액세스하려고 할 때마다 동일한 예외가 발생합니다. 여전히 유효한 열을 매핑하려는 것 같습니다.
def valid_column=(valid)
write_attribute(:valid, valid)
end
def valid_column
read_attribute(:valid)
end
그것이 중요한지 확실하지 않지만 여기에 내 환경의 세부 사항이 있습니다.
- Windows Ruby 1.8.6
- Linux 서버의 Informix 데이터베이스
- ActiveRecord (2.3.4)
- ActiveRecord-Informix-Adapter (1.0.0.9250)
- Ruby-Informix (0.7.1)
미리 감사드립니다!
해결책
이 시도:
class MyTable < AR:Base
class << self
def instance_method_already_implemented?(method_name)
return true if method_name == 'valid'
super
end
end
end
해킹이며 레일 3에서는 작동하지 않을 수도 있지만 지금은 문제를 해결할 수 있습니다.
나는 그것을 발견했다 Ruby on Rails 메일 링리스트
원한다면 볼 수도 있습니다 Datamapper, 이것은 이런 종류의 것들을 다소 더 산만하게 처리합니다.
다른 팁
SAFE_ATTRIBUTES 사용 - https://github.com/bjones/safe_attributes . 상자에서 완벽하게 작동합니다.
class WebsiteUser < ActiveRecord::Base
establish_connection 'cf_website'
set_table_name 'nc_users'
bad_attribute_names :hash
end
Activerecord의 예약 된 속성에 대해 걱정하지 않고 보석에 보석을 추가하면 보석이 이름 충돌을 자동으로 처리합니다.
gem 'safe_attributes'
읽기의 경우 SQL의 select-as 문을 사용할 수 있습니다. 다음이 작동하는지 확실하지 않지만 기본 범위로 인해 쉽게 수행 할 수 있습니다.
class MyRecord < ActiveRecord::Base
default_scope :select=> 'valid as valid_column'
end