2011-03-25 3 views
2

변경할 수없는 데이터베이스에 액세스하고 있으며 attribute 열이 정의되어 있습니다. attribute에 액세스하려고 시도 할 때마다 예외가 발생합니다.'attribute'라는 열이있는 데이터베이스에서 ActiveRecord를 사용하려면 어떻게해야합니까? (DangerousAttributeError)

? 나는이 문제를 해결하지만,

class << self 
    def instance_method_already_implemented?(method_name) 
     return true if method_name == 'attribute' 
     super 
    end 
    end 
나를 위해 작동하지에 대한 메일 링리스트 레일에 루비의 계획을 발견

class User < ActiveRecord::Base 
     def self.authenticate(username,password) 
     where(:username => username, :value => password).first 
     end 
end 

:

내 코드 액티브 (액티브 :: DangerousAttributeError)에 의해 정의된다

중요한지 확실하지 않지만 다음은 내 환경에 대한 세부 정보입니다.

  • ruby ​​1.9.2p0 (2010-08-18 revisi

    플랜 A : 29,036) x86_64에-darwin10.4.0] 해결

  • 레일
  • 3.0.1 액티브 (3.0.1) activeresource (3.0.1)

UPDATE()에 : 열 x 들어

select("username, value").where(:username => username, :value => password).first 
+0

'attribute?'또는'attribute'에 대한 예외입니까? 물음표가 어디에 있는지 유의하십시오. –

+0

''attribute? '에 대한 예외.'attribute' 컬럼이 변경되었고 – jean

답변

2

액티브 쿼리 당신이 문자열로 당신에게 반환 할 필드를 정의 할 수있는 :select 매개 변수를 지원합니다. 당신이 당신의 데이터베이스 서버의 원시 쿼리 언어를 알고 있다면 당신은 선택 문자열에 그것을 사용할 수 있습니다

:select => 'field1, field2' 

:

보통 사람들은 같은 것을 사용합니다. 사용하여 필드를 선택할 때 옵션 중 하나는 SQL은 as 수정 사용하는 것입니다

select field1 as the_first_field, field2 as the_second_field 

를 데이터베이스는 새로운 필드 이름 대신 기존의 필드 이름을 사용하여 필드를 반환합니다. 데이터베이스가이를 지원할 경우 Rails와 충돌하는 방식으로 명명 된 레거시 필드를 쉽게 관리 할 수 ​​있습니다.

Ruby on Rails Guides의 "Five ActiveRecord Tips"및 "Selecting Specific Fields"에서 "ActiveRecord의 선택 : 매개 변수 선택"을 참조하십시오. 내 포스트 그레스 DB에 액세스 할 수 rails console를 사용하여 애플 리케이션

여기에 내 레일 중 하나의 예입니다 :

ruby-1.9.2-p180 :007 > dn = DomainName.first 
=> #<DomainName id: 1, domain_name: "ip72-208-155-230.ph.ph.cox.net", created_at: "2010-04-20 05:53:22", updated_at: "2010-04-20 05:53:22"> 
ruby-1.9.2-p180 :008 > dn = DomainName.first(:select => 'id, domain_name as dn') 
=> #<DomainName id: 1> 
ruby-1.9.2-p180 :009 > dn['id'] 
=> 1 
ruby-1.9.2-p180 :010 > dn['dn'] 
=> "ip72-208-155-230.ph.ph.cox.net" 
+0

감사합니다 you.i이 계획을 알고, 난 원시 쿼리 언어 before.but 언젠가는 안전하지 사용합니다. – jean

+0

이것은 원시 SQL을 사용하지 않고 쿼리의 일부일 뿐인 select 문을 사용합니다. 'where' 절은 매개 변수를 올바르게 처리하지 않으면 안전하지 않을 수 있습니다. –

+0

하지만 ActiveRecord는 여전히'attribute' 칼럼의 모든 메소드를 만들려고합니다. –

1

, 액티브가 x, x=x? 방법을 생성한다. 그래서,이에 수정 업데이트 :

class << self 
    def instance_method_already_implemented?(method_name) 
     return true if method_name == 'attribute?' 
     super 
    end 
end 
+0

이 변경되었고'attribute_before_type_cast가 ActiveRecord에 의해 정의되었습니다 '오류가 발생했습니다 – jean

+0

method_name =='attribute_before_type_cast''가 true이면 'instance_method_already_implemented?'의 목록에 추가하면 어떻게됩니까? –

+0

내 업데이 트를 참조하십시오,하지만 많은 해결'method_name ==' – jean

0

어쩌면 당신은 이름이 다른 방법을 사용하여 alias_attribute를 사용할 수 있습니다.

관련 문제