2010-12-31 5 views
0

저는 수년간 쉘 스크립팅을 해왔지만 최근에 Ruby를 사용하여 OOP 프로그래밍을 수행하고 Rails 애플리케이션을 작성하는 초보 프로그래머입니다.Usng Rails ActiveRecord 관계

정의 된 모델 관계를 사용하는 방법에 대해 머리를 감싸는 데 어려움을 겪고 있습니다.

나는 Google 검색을 시도했지만, 기본적으로 has_many, belongs_to 등의 모든 것을 의미하는 치트 시트가 있습니다. 이 항목은 &을 쉽게 이해할 수 있습니다. 특히 SQL로 직접 많은 작업을 해본 결과입니다.

내가 정의하지 않은 것은 실제로 정의 된 관계를 사용하는 방법입니다.

내 경우

나는 3 개 모델이 있습니다 위치 호스트 서비스

관계 (실제 코드가 아닌 그냥 단축) : 나는 할 수 있도록하려면이 경우

Services 
    belongs_to :hosts 

Hosts 
    has_many :services 
    belongs_to :locations 

Locations 
    has_many :hosts 

서비스로 작업하는 동안 위치에서 열을 표시합니다. SQL에서 이것은 간단한 조인이지만 Rails/Ruby 방식으로하고 싶습니다. 또한 코드에서 SQL을 사용하거나 조인을 다시 정의하지 마십시오.

답변

0

위치에 has_many through를 정의 할 수 있습니다.

SELECT "services".* FROM "services" INNER JOIN "hosts" ON "services".host_id = "hosts".id WHERE (("hosts".location_id = 1)) 

... 주어진 위치에 대한 모든 서비스를 모아이이 쿼리를 생성합니다

Location.first.services 

:

Locations 
    has_many :hosts 
    has_many :services, :through => :hosts 

Hosts 
    belongs_to :location 
    has_many :services 

Services 
    belongs_to :host 
    has_one :location, :through => :host #This relationship is optional 

그런 다음에 의해 서비스에 액세스 할 수 있습니다 .

편집 : 나는 상대방과의 관계를 원한다는 것을 알고 있습니다. 이를 위해 각 서비스가 하나의 호스트에 속하고 각 호스트가 하나의 위치에 속하기 때문에 service.host.location을 수행하여 서비스에서 위치에 액세스 할 수 있습니다. 위의 선택적 관계를 추가 할 수도 있으므로 service.location.column_name을 입력하면됩니다. 그래서 당신은 당신의 모델에 대한 단수 이름을 사용하는 것이 익숙해한다 알고 들어

+0

또한 Seth는 적절하게 복수화해야하는 관계에 대해 정확합니다. 또한 위치에 대한 쿼리는 '첫 번째'와 다를 수 있지만이를 달성하는 방법에 대한 좋은 예입니다. –

+0

참여 테이블이 각 소유 측면에 속하지 않으므로 Has_many through가 작동하지 않습니다 ... – sethvargo

+0

사실이 아닙니다.그것은 효과가있다. 이 쿼리를 생성합니다 : SELECT "services". * FROM "services"INNER JOIN "호스트" "서비스".host_id = "호스트".id WHERE (""hosts ".location_id = 1) –

0

, 지금의 관계가 실제로 의미하게

 Service 
     belongs_to :host 

    Host 
     has_many :services 
     belongs_to :location 

    Location 
     has_many :hosts 

주의 사항 : 호스트 has_many 서비스를하는 belongs_to 서비스 호스트 및 위치 has_many는 레일 콘솔 입어 이제

를 호스팅 :

service = Service.create(:name => 'ServiceName')#assuming you only have that field and the host_id of course 
service.host# right after creation will return an empty array...so create a host 
host = Host.create(:name => 'HostName')#assuming you only have that field and the id of course 
#if both were saved to db 
host.services << service 
#or 
service.host << host #should work for you 

service.host.name   
service.host.id # or any other column you have there 
관련 문제