2011-09-15 2 views
0

내 기사에서 얼마나 많은 사람들이 내 기사를 읽었는지 알 수있는 번호를 인쇄합니다. 다음과 같이 보입니다.레일즈 3 - 연관

<%=article.hits.count%> 

나는 알 수 있듯이, 나는 간단한 연관을 만들었습니다. 이제 내 페이지에 로그인 한 사용자가이 기사를 이미 읽었을 경우 정보를 얻으려고합니다. hits이 들어있는 테이블에 user_id 열이 있습니다.

<% if session[:login_user_id].hits.user_id == session[:login_user_id]%> 
    Have you read it already. 
<% end %> 

그러나 예를 들어 위의 저를 작동하지 않습니다 ... 누군가가 나를 도울 수하십시오 하지만 여전히 방법을 찾을 수 없습니다, 얻는 방법 ...

내가 좋아하는 뭔가를 시도 , 수행하는 방법?

편집 : 모델 : 사전에

class Article < ActiveRecord::Base 
    has_many :hits 
end 

class Hits < ActiveRecord::Base 
    belongs_to :article, :class_name => "DataHit", :foreign_key => "article_id" 
    has_many :users 
end 

class User < ActiveRecord::Base 
    belongs_to :hit 
end 

감사

+0

모델을 관계식과 함께 추가 할 수 있습니까? 적어도 문제와 관련이있는 모델을 추가 할 수 있습니까? 우리는'Article','Hit' 및'User' 모델 사이의 관계를 필요로합니다. 아니면 user_id가 관계없이 'Hit'모델에 직접 저장되어 있습니까? – mliebelt

+0

원래 게시물을 업데이트했습니다. – user1946705

답변

1

당신이 받고 싶은 모델에 대한하자의 첫 번째 이야기. 나를 위해, 그것은 다음과 같이 들린다 :

  • 모든 기사는 많은 사용자가 방문/읽을 수있다.
  • 모든 사용자는 많은 기사를 읽거나 방문 할 수 있습니다.
  • 이것은 일반적으로 has-many-through 연관에 의해 구현되는 고전적인 n:m -association입니다.

    • :

      물론
      class Article < ActiveRecord::Base 
          has_many :hits 
          has_many :users, :through => :hits 
      end 
      
      class Hits < ActiveRecord::Base 
          belongs_to :article, :class_name => "DataHit", :foreign_key => "article_id" 
          belongs_to :user 
      end 
      
      class User < ActiveRecord::Base 
          has_many :hits 
          has_many :articles, :through => :hits 
      end 
      

      , 당신은 최종 DB 모델은 그렇게 있는지 확인 마이그레이션을 추가해야합니다 :이 의도 인 경우

    , 그것은 다음과 같이 구현한다 조회수가 article_id 및 user_id이므로 사용자가 읽은 기사를 찾을 수 있습니다.

odel 구현, 더 쉬워야합니다. 그런 다음 사용할 수있는 작업은 @article.users.contains(User.find(user_id))입니다. Ruby on Rails Guides에있는 튜토리얼을 살펴보면 has-many-through 관계가 무엇이며 어떤 장점이 있는지 설명합니다.

레일스 콘솔에서 처음 시도 할 때 도움이 될 것입니다. 이를 위해 시작 :

  1. 시작 응용 프로그램의 루트 디렉토리에있는 레일 콘솔 : rails c
  2. 이 ID로 문서를 얻기 위해 : 예컨대이 art = Article.find(1)를 입력합니다.
  3. 사용할 수있는 모든 방법을 보려면 art.methods.sort의 방법을 시도해보십시오. users 메쏘드가 없다면, 당신은 그 유대 관계에 잘못된 것이 있습니다.
  4. 전화 : us = art.users을 시도하고 그 결과를보십시오. 이것은 레일스 특정 객체, 컬렉션처럼 동작하는 객체이며 해당 컬렉션에 사용자를 추가하고 제거하는 방법을 이해합니다 (전체 라이프 사이클주기와 함께).현재 갖고있는 오류가 다른 것을 의미 할 수 있습니다.
    • 데이터베이스 모델이 Rails에 정의 된 연결과 일치하지 않습니다 (그럴 것 같습니다).
    • 레일스를 방해하는 약간의 비틀기 (맞춤법 어딘가).

나는 우리가 한 번 여기에 문제를 해결할 수 있다고 생각하고 모든 시간을 위해하지 않습니다, 이것은 당신이 다음에 무엇을 몇 가지 단서를 제공하겠습니다.

+0

설명해 주셔서 감사합니다. 내 응용 프로그램에 노트를 적용하려고했지만 여전히' '에 대해'정의되지 않은 메소드'contains '를 포함하는 오류가 발생합니다. 나는'contains'에 대한 정보를 찾으려고 노력했지만 아무 것도 찾지 못했습니다 ... – user1946705