ActiveRecord가 자동으로 : id 속성을 별도의 열에도 기본 키로 할당하여 고군분투하고 있습니다.레일스 ActiveRecord가 기본 키가 아닌 id 열을 처리합니다.
Table - legacy-table
id - int
pk_id - int (primary key)
name - varchar2
info - varchar2
모델
class LegacyModel < ActiveRecord::Base
self.table_name = 'legacy-table'
self.primary_key = 'pk_id'
default_scope {order(:name => :asc)}
alias_attribute :other_id, :id
end
내가 액티브가 자동으로 기본 키 (pk_id) 할당하는 것을 걱정하지 않는다 : ID는 그러나 내가 실제 id 컬럼에 대한 모든 액세스 권한을 잃게 때문이다. 별칭을 사용하면 간단히 기본 키를 다시 나타냅니다.
그러나이 문제에 대한 한 가지주의 사항은 @legacymodel [: id]를 사용하여 뷰에서 id 열에 액세스 할 수 있다는 것입니다. 그러나 다시 @ legacymodel.id를 호출 할 때 pk_id 열의 값을 얻습니다. 내가 원하는 것은 @ legacymodel.other_id를 호출하여 id 컬럼을 가리킬 수 있도록하는 것이다. 대신 @ legacymodel.service_id, @ legacymodel.id 및 @ legacymodel.pk_id는 모두 같은 열을 가리 킵니다. pk_id
이 열은 기존 DB이므로 열을 수정하는 것은 의문의 여지가 있습니다. 레일즈 4를 MySql과 함께 사용하고 있습니다.
어쨌든이 코드를 작성 하시겠습니까? @legacymodel [: id]가 왜 @ legacymodel.id에서 다른 결과를내는 이유는 무엇입니까?
동의, write_attribute 로직을 전달하는 쉬운 해결 방법이 있습니까? 아니면 ActiveRecord를 재정의 유일한 방법입니까? – Matt
나는 이것을 극복 할 수있는 좋은 방법을 생각할 수 없다. 고려해야 할 한가지 옵션은'write_id_attribute'라는 새로운 메서드를 만드는 것입니다.이 메서드는'primary_key' 로직없이'write_attribute'의 복사본입니다. 그런 다음 모델에서'def other_id = (value) write_id_attribute (: id, value) end'를 가질 수 있습니다. 이것은 특별한 논리가이 한 모델에서'id'를 위해서만 사용될 것이고 표준'write_attribute'가 다른 모든 것에 여전히 사용 될 것이라고 확신 할 것입니다. – cschroed