2014-11-20 3 views
1

레일 4를 사용하여 컨트롤러에서 인스턴스 변수에 속성을 추가하고 싶습니다.레일 4의 인스턴스 변수에 속성을 어떻게 추가합니까?

불쌍한 예를 들어 드려 죄송합니다. 간단하게 유지하려고합니다.

예. 컨트롤러에서는 John이라는 사용자를 찾아 새로운 인스턴스 변수를 만듭니다. 이제, 내 컨트롤러에서 John이라는 이름의 모든 사용자에 대해 모든 연령을 합산하여 합계 된 나이를 인스턴스 변수에 다시 입력하여보기에 사용할 수있게하려고합니다.

사용자 모델에는 'id', 'name'및 'age'속성이 있습니다.

@foo_users = Users.where(name: 'John') 

@foo_users.each do |foo| 
    @foo_users.age_sum = Users.where(name: 'John').sum(:age) <-- this does not work 
end 

합산 된 나이를 데이터베이스에 저장하지 않아도 하나의보기에서만 사용하므로 나는 모든 사용자를 표시 할 수 있도록하고 싶습니다 :

<% @foo_users.each do |user| %> 
    User name: <%= user.name => 
    Sum of ages: <%= user.age_sum %> 
<% end %> 

업데이트 : 나의 예를 단순화 이상 내가있을 수 있습니다. 여기 현실에 가깝습니다.

회사가 소유 한 호텔. 호텔에는 방이 있습니다. 관리 소프트웨어는 API를 통해 호텔 _ 통계를 회사에 매일 제공합니다. 더 좋은 소식이 없으므로 호텔 _ 통계에는 hotel_id, 일일 체크인, 일일 체크 아웃이 포함됩니다. 내가 작업중인 회사의 백 오피스 레일스 애플리케이션에는 표시된 가장 최근의 통계치가있는 호텔 테이블이있다.

Hotel Id: 123 
Daily check-ins: 50 
Daily check-outs: 48 

Hotel Id: 124 
Daily check-ins: 35 
Daily check-outs: 37 

회사는 또한 체크인 (아웃 순 체크인)의 지난 30 일의 누적 합계를 표시하고 싶어 : 한 줄과 같을 것이다. 이 작업을 수행하려면 컨트롤러에서 가장 최근 날짜 (일반적으로 어제)에 Hotel_Statics를 찾습니다.

latest_stat = HotelStatistic.order('date DESC, hotel_id DESC').first 
@latest_date = latest_stat.date 
@recent_stats = HotelStatistic.where(date: @latest_date).order('hotel.id ASC').all 

내보기에 @recent_stats의 세부 정보를 표시합니다.

이제 각 호텔에 대한 @ recent_stats.check_ins의 지난 30 일 간의 합계를 내보기에 표시하고 싶습니다. 내 생각과 같은 특정 호텔에 대한 check_ins 통계의 지난 30 일을 요약했다 :

@recent_stats.each do |stat| 
    @last_30_days_check_ins = HotelStatistic.where(hotel_id: stat.hotel_id).where("date >= ?", Date.today - 30).sum(:check_ins) 
end 

수학 작품,하지만 난 각 호텔의 30 일 합 변수에 액세스 할 수있는 방법이 필요합니다. 당신의 제안 답변에

<% @recent_stats.each do |statistic| %> 
    Hotel Id: <%= statistic.hotel_id %> 
    Daily check-ins: <%= statistic.check_ins %> 
    Last 30 days check-ins: <%= statistic.last_30_days_check_ins %>  
<% end %> 

이 더 현실적인 예는 아무것도 변경합니까 : 나는 내가 할 수있는 내보기에 그래서 @recent_stats 인스턴스 변수에 호텔 30 일 합을 추가하여보기에이 쉽게을 기대하고 있었는데 ? 덕분에 문제를 해결해야 select를 사용

+0

왜 downvote에서 컨트롤러

@recent_stats 구축을위한 기존 코드를 계속 시도? 나는 분명히 혼란 스럽다. – Ryan

답변

0

유형은 ActiveRecord::Relation입니다. 의미 적으로 age_sumActiveRecord::Relation 개체의 특성이 아니기 때문에 ActiveRecord::Relation 개체에 age_sum을 새 특성으로 추가하려는 것은 의미가 없습니다. 새 인스턴스 변수에 연령의 합계를 저장하는 것이 좋습니다 (예 : @user_age_sum).

UPDATE 다음

class HotelStatistic < ActiveRecord::Base 
    belongs_to :hotel 
end 

class Hotel < ActiveRecord::Base 
    has_many :hotel_statistics 

    def last_30_days_check_ins 
    self.hotel_statistics.where("date >= ?", 30.days.ago).sum(:check_ins) 
    end 

end 

<% @recent_stats.each do |statistic| %> 
    Hotel Id: <%= statistic.hotel_id %> 
    Daily check-ins: <%= statistic.check_ins %> 
    Last 30 days check-ins: <%= statistic.hotel.last_30_days_check_ins %>  
<% end %> 
+0

감사합니다. 그것이 내가 두려워했던 것입니다. 내. 각 루프에서 각 사용자에 대해 새로운 변수를 작성할 수 있습니까? 예를 들어 @ {user.name} .age_sum? – Ryan

+0

사용자 모델에'age_sum'이라는 새로운 속성을 추가 할 수는 있지만, 의미 상'age_sum'은 User 객체의 속성이 아니기 때문에이 속성을 사용하는 것이 좋습니다. 객체 지향 프로그래밍의 관점에서 볼 때 기본 아이디어는 사용할 수있는 객체가 아니라 올바른 객체에 속성을 저장해야한다는 것입니다 (사용자의 경우 'ActiveRecord :: Relation'과'User'). – Hoa

+0

내 질문이 업데이트되었습니다. 감사합니다 – Ryan

0

:

@users = User.select("*, SUM(age) as age_sum").where(name: 'John') 

이제 @users 배열의 각 Userage_sum 속성이 있습니다. 속성의 값이 각 인스턴스에서 동일하므로 100 % 이상이 아니지만보기를 설정 한 방법과 함께 사용할 수 있습니다.

그것은 동적으로 수동으로 인스턴스의 메소드를 정의하는 것이 가능 편집이 가능하면서

@foo_users.each do |foo| 
    def foo.age_sum; Users.where(name: 'John').sum(:age); end; 
end 

는 그러나,이 월 부정적인 영향을 정당화 할 수있는 아주 좋은 사용 사례 될 것 (예 : 코드가 얼마나 읽기 쉽고, 효율적이며, 유지 보수가 가능한지). 아마도 같은 문제를 해결하는 훨씬 더 나은 객체 지향 방법이있을 것입니다.

+0

감사합니다. 올바른 결과를 얻지 만 질문에 대답하지 않습니다. 문제는 이미 설정된 인스턴스 변수에 새 속성을 삽입하는 방법입니다. – Ryan

+0

충분하다. 편집 내 대답 – Pete

+0

을 참조하십시오.보다 현실적인 사용 사례는 원래 질문에 대한 내 편집을 참조하십시오. 감사. – Ryan

관련 문제