2016-08-13 2 views
0

나는 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 
+1

에 대한 인스턴스 메서드로 weight_multiplier을 호출 할 수 있습니다. "코드 구토 (code vomit)"가 없는데, 하나의 코드가 여러 파일 - 조금만 더 구체적으로 여기 부탁드립니다. 당신은 우리에게 당신의 결과에 대한 최소한의 요지/여기에서하려고하는 것을 줄 수 있습니까? 레일스 콘솔 프롬프트가 적절할 수도 있습니다. –

+0

최소한의 코드가 추가되었습니다.이 코드가 좀 더 명확 해지기를 바랍니다. –

+0

나는 아직도 그것을 얻지 않을까 걱정된다. 당신은 레일스 콘솔에서 당신의 프로세스를 바꾸어 주며 어쩌면 우리를 데려 갈 수 있습니까? 당신은 "몇 개의 속성을 연관 짓다"에서 그리고 그때부터 나를 잃어 버립니다. –

답변

1

당신은

def total_weight 
    @total_weight ||= Advertisement.sum(:weight) 
end 

def weight_multiplier 
    self.weight.to_f/total_weight 
end 

다음 Advertisement 클래스에 2 개 개의 새로운 방법을 추가 할 수 있습니다 Advertisement 인스턴스

+0

예! 그게 정확히 내가 필요했던거야, 고마워! –