2011-04-07 2 views
0

나는 프로그래밍에 관해서는 조금 느리지 만, 나는 그것을 즐기고 최대한 많이 배우려고 노력한다. 미리 사과드립니다. 제 질문으로는 분명하지 않습니다.find_by_or_initialize_by * _and_ * 및 증분!

DJ가 노래를 검토하고 노래 리뷰를 주별로 그룹화하는 유일한 목적의 앱이 있습니다. 5 분야 ... songid, 주, stdjlike, stthinkclublike, stplait (내가 아는 끔찍한 이름들,하지만 그들은 내가 무엇인지 기억할 수있게 도와줍니다 :)).

일단 사용자가 노래를 검토하기로 결정하면 1 ~ 5의 척도로 응답되는 3 개의 질문을 받게되고 양식은 3 개의 답변과 사용자 상태 및 노래 ID를 수집합니다. 대부분의 경우 데이터베이스는 상태와 노래 ID를 찾은 다음 새 데이터를 3 개의 질문 필드 (djlike, thinkclublike, plait)에 추가합니다. 그러나 새로운 주에있는 사용자의 노래에 대한 첫 리뷰는 새로운 기록을 만들어야합니다.

"뉴욕"사용자가 처음으로 리뷰 (노래) "123"사용자가되면 노래 ID, 주 이름을 가진 새 레코드를 만들고 리뷰 값을 다음에 추가합니다. 3 열 stdjlike, stthinkclublike 및 stplait. 다음 사용자는 다른 사용자가 뉴욕에서 노래 "123"을 작성하여 리뷰를 작성하며 stdjlike, stthinkclublike 및 stplait 값을 이전 검토에 추가하여 레코드를 업데이트합니다.

저는 일주일 내내 살펴 보았지만 비슷한 문제는 아니지만 같은 문제에 대한 많은 좋은 해결책을 찾고 있습니다 (A well documented solution here). 저는 고정 숫자가 아닌 값으로 업데이트하고 있기 때문에 증가분을 사용하기로 결정했습니다. 시도했지만 시도 할 수 없습니다.

나는 무엇이 작동하는지 시작했다. reviewstate 컨트롤러의 create는 단순한 .new 및 .save 일 때 레코드를 저장합니다. 그래서 나는 그것을 여기에서 ..로 바 꾸었습니다.

def create 

@reviewstate = Reviewstate.find_or_initialize_by_songid_and_state(song.id, current_user.state) 
@reviewstate.stdjlike.increment!(:stdjlike, reviewstate.stdjlike) 
@reviewstate.stthinkclublike.increment!(:stthinkclublike, reviewstate.stthinkclublike) 
@reviewstate.stplait.increment!(:stplait, reviewstate.stplait) 
@reviewstate.save! 
end 

작동이 멈 춥니 다. 나는 다른 유사 및 방법을 시도했다, 이것은 나가 가까운 감을 느낄 때이다. 저를 도와주세요. 4 일이되었습니다 :).

미리 감사드립니다.

답변

0

find가 레코드를 리턴하지 않고 새 레코드가 초기화되면, 마이그레이션에서 다른 기본값을 설정하지 않는 한 stdjlike는 nil이됩니다. 따라서 증가분은 Nil만큼 증가하려고합니다. Nil은 fixnum이 아니며 작동하지 않습니다. 나는 이것이 당신이 얻는 오류라고 생각합니다.

또한 @reviewstate에 개체를 저장 한 다음 reviewstate.stdjlike를 사용하여 개체를 참조합니다. 인스턴스 변수 @reviewstate가 있고 로컬 변수 reviewstate를 참조합니다. 그것들은 두 개의 다른 대상입니다.

다르게 처리해야합니다. 기록이 있는지 확인하십시오. 그렇다면 그냥 받으십시오. 그렇지 않다면 생성하십시오. Reviewstate.exists?를 사용하십시오.

또한 Ruby는 이름에 대한 규칙으로 밑줄을 사용합니다. 그렇게하면 std_jlike 같은 것을 만들 수 있습니다. 그러나 당신은 항상 당신이 편안하게 느끼는 것을 사용할 수 있습니다.

+0

두 답변 모두 매우 잘 설명되어 있고 매우 도움이되었지만 실제로는이 방향으로 계속하는 방법에 대한 질문에 대한 대답이라고 생각합니다. 처음에는 IF 성명서라고 생각했지만, 온라인으로 읽고 연구를 많이할수록 더 혼란스러워졌습니다. 다른 대답에 대해 언급했듯이이 섹션을 원래 디자인으로 더 간단하게 만들 예정입니다. 그러나 IF 문을 다른 매우 유사한 부분에 사용할 것입니다. 당신의 공헌에 대해 대단히 감사합니다. 두 가지 다른 대상에 대한 설명이 제 이해에 도움이되었습니다. – Dol

+0

당신이 환영받는 것 이상입니다. 다른 것을 물어보고 싶다면, 주저하지 말고 :) – Spyros

0

이것은 상당히 격렬하게 들릴 것 같지만, 장기적으로 당신을 위해 더 단순하게 만들 것이라고 생각합니다. 꽤 큰 리펙터를 추천 할 것입니다.

  • 사용자 (또는 DJ) 내가 그렇게 응용 프로그램을 구성 할

  • 노래
  • 검토 : 당신이 자신의 모델이되어야합니다 몇 가지를 것 같은데 한 주, 한 명의 사용자 및 한 곡에 리뷰가 속한 것입니다.

    #user.rb 
    class User << ActiveRecord::Base 
        has_many :reviews 
    end 
    
    #state.rb 
    class State << ActiveRecord::Base 
        has_many :reviews 
    end 
    
    #song.rb 
    class Song << ActiveRecord::Base 
        has_many :reviews 
    end 
    
    #review.rb 
    class Review << ActiveRecord::Base 
        belongs_to :user 
        belongs_to :state 
        belongs_to :song 
    end 
    

    그런 다음 표시 할 통계 양식을 수집하려면 검토 레코드에서 통계를 파생시킵니다. 이렇게하면 주, DJ 또는 노래에서 통계를 얻을 수 있습니다.

    이것은 시스템의 더 많은 오브젝트가 (C) Reated, (R) ead, (U) pdated 및 (D) estroyed가 될 수있는 자원으로 표시되는보다 RESTful 한 구현입니다. 일반적으로 RESTful 방식으로 작업하면 레일에서 작업 할 때 훨씬 쉽게 작업 할 수 있습니다.

  • +0

    감사합니다. 나는이 모델들과 그 이상을 모두 가지고 있지만 상태 모델을 추가하는 것에 대해서는 생각하지 않았습니다. 그것의 좋은 생각. 또한, 나는 시간과 더 많은 이해와 희망을 갖고 더 편안한 정신으로 들어가야합니다. 문제는 변덕스럽게이 페이지를 더 복잡하게 만들기로 결정했기 때문에 데이터베이스에서 더 쉬울 것이라고 생각했습니다. 하지만 생각보다 간단한 형식으로 돌아가 겠지만 다른 방법을 사용하여 동일한 결과를 얻을 수 있기를 바랍니다. 그래서 저는 원래 디자인으로 리팩토링 할 것입니다. 기여해 주셔서 다시 한 번 감사드립니다! – Dol