2011-08-22 4 views
3

내 레일 어플리케이션에 IP 주소 (v4 및 v6)를 저장하려고합니다. an extension to MySQL은 IP 문자열을 쉽게 IP 범위로 질의 할 수 있도록 바이너리로 변환하는 기능을 추가했습니다.ActiveRecord에서 삽입/업데이트 용 SQL 함수 사용

SELECT 형식 쿼리에 이스케이프 처리되지 않은 SQL 문을 사용할 수 있습니다.

힘든 부분은 필드가 삽입/업데이트 문에 대해 이스케이프 처리되는 방식을 덮어 쓰는 방법이 필요하다는 것입니다.

new_ip = Ip.new 
new_ip.start = '1.2.3.4' 
new_ip.save 

는 다음과 같은 SQL 문

INSERT INTO ips(start) VALUES(inet6_pton('1.2.3.4')); 

이 할 수있는 방법이 있나요을 생성해야이 액티브 문? ActiveRecord::Base#arel_attributes_values을 오버라이드하는 것을 포함하여 많은 일들을 시도했지만, 행운을 불렀다. 생성 된 sql은 항상 바이너리로 변환된다 (문제가 있다면, 나의 칼럼은 MySQL VARBINARY (16)이다).

답변

0
ActiveRecord::Base.connection.execute("INSERT INTO ips(start) VALUES(inet6_pton('1.2.3.4'))") 
+0

아니라 그래 내가 사용의 장점을 유지하고자하는 일반 전화와 (등 검증, 콜백,) 그와 함께 제공되는 모든 모든 possibble 경우를 생성/저장이 또한 SQL에 대해 보호하지 않습니다 – Jimmy

+0

주입 –