나는 mysql 데이터베이스를 쿼리하고 조인에 의해 생성 된 객체의 배열을 리턴한다. 내가 아는 바로는 ActiveRecord select 명령은 조인에있는 두 테이블의 속성을 가진 새로운 객체의 배열을 반환합니다.Rails의 ActiveRecord 객체에 property/method_missing 접근법을 추가하는 방법은 무엇입니까?
각 개체에 대해 몇 가지 계산을 수행하고 개체에 몇 가지 특성을 연결하려고합니다. 나는 이것이 나의 수업 이었다면, 나는 here처럼 method_missing 접근법을 사용할 수 있다는 것을 이해한다. 그러나이 객체는 select 명령으로 생성 되었기 때문에 add_attrs
함수를 정의 할 수있는 클래스 코드가 없습니다. 이것이 가능한가? method_missing 올바른 접근 방식을 사용하고 있다면 그렇다면 어떻게 구현합니까?
다음은 ActiveRecord 개체의 배열을 반환하는 초기 쿼리입니다. 내가 루비 콘솔로 이동하여 명령
advertisements = Advertisement.joins(:locations).select_with_location
puts advertisements[0].inspect
나는 같은 것을 받아야 입력한다면
def self.select_with_location
select("advertisements.id, advertisements.weight, locations.latitude, locations.longitude")
end
: 이제
{id: 0, weight: 5, locations.latitude: 49.03030, locations.longitude: 50.5050}
을, 내가 원하는 반복하는 것입니다 광고를 통해 각 가중치에 대한 계산을 수행합니다. 그 계산의 결과를 광고의 새로운 속성으로 저장하고 싶습니다. weight_multiplier
으로 전화하고 싶습니다. 이 계산 후, 나는 루비 콘솔로 이동하는 경우 다음 명령을 입력
puts advertisements[0].inspect
나는 숫자 자체가 중요하지 않은이 예에서 결과를
{id:0, weight: 5, locations.latitude: 49.03030, locations.longitude: 50.5050, weight_multiplier: 0.446003}
을 얻고 싶은 것 , 배열의 각 광고에 weight_multiplier 특성을 추가하기 만하면됩니다.
나는 다음과 같은 코드가 잘못 알고 있지만,이 기능이 어떤 작업을 수행하는지의 요지입니다 :
def self.assign_weight_multiplier advertisements
totalWeights = advertisements.inject(0){|sum,advertisement| sum + advertisement.weight }
advertisements.each do |advertisement|
advertisement.weight_multiplier = (Float(advertisement.weight)/Float(totalWeights))
end
advertisements
end
에 대한 인스턴스 메서드로
weight_multiplier
을 호출 할 수 있습니다. "코드 구토 (code vomit)"가 없는데, 하나의 코드가 여러 파일 - 조금만 더 구체적으로 여기 부탁드립니다. 당신은 우리에게 당신의 결과에 대한 최소한의 요지/여기에서하려고하는 것을 줄 수 있습니까? 레일스 콘솔 프롬프트가 적절할 수도 있습니다. –최소한의 코드가 추가되었습니다.이 코드가 좀 더 명확 해지기를 바랍니다. –
나는 아직도 그것을 얻지 않을까 걱정된다. 당신은 레일스 콘솔에서 당신의 프로세스를 바꾸어 주며 어쩌면 우리를 데려 갈 수 있습니까? 당신은 "몇 개의 속성을 연관 짓다"에서 그리고 그때부터 나를 잃어 버립니다. –