5

has_many : through 연관을 통해 조인 모델에서 속성을 선택하는 가장 쉽고/가장 우아한 방법이 무엇인지 궁금합니다. , CatalogueItems가 위치 속성이 있다고 말할 수 및 카탈로그와 모든 항목 사이에 하나의 CatalogueItem이 있음을 또한우아하게 has_many에서 속성 선택하기 : Rails에서 모델 조인하기

class Item < ActiveRecord::Base 
     has_many :catalog_items 
     has_many :catalogs, :through => :catalog_items 
end  

:

우리는 다음과 같은 항목 클래스 항목, 카탈로그 및 CatalogItems가 있다고 가정하자 .

위치 속성을 검색하는 가장 확실한하지만 약간 실망 방법은 다음과 같습니다

@item   = Item.find(4) 
@catalog  = @item.catalogs.first 
@cat_item  = @item.catalog_items.first(:conditions => {:catalog_id => @catalog.id}) 
position  = @cat_item.position 

이 짜증나는 우리가 우리가 완전히이 있기 때문에 item.catalogs.first.position @ 할 수 있어야한다는 것 때문에 @ item의 카탈로그 중 첫 번째 위치에 해당하는 위치를 지정합니다.

나는이를 얻기 위해 찾은 유일한 방법은 다음과 같습니다

class Item < ActiveRecord::Base 
     has_many :catalog_items 
     has_many :catalogs, :through => :catalog_items, :select => "catalogue_items.position, catalogs.*" 
end 

지금 내가 Item.catalogs.first.position 할 수 있습니다. 그러나 이것은 약간의 해킹처럼 보입니다. 카탈로그 인스턴스에 추가 속성을 추가하고 있습니다. 또한 @ catalog 로그에 Catalog.find 또는 @ item.catalogs를 채우는 두 가지 상황에서보기를 사용하려는 가능성을 열어줍니다. 하나의 경우, 그 위치는 그곳에 있고 다른 위치는 그렇지 않을 것입니다.

아무에게도 좋은 해결책이 있습니까?

감사합니다.

답변

0

당신은 같은 것을 수행 할 수 있습니다

# which is basically same as your "frustrating way" of doing it 
@item.catalog_items.find_by_catalogue_id(@item.catalogs.first.id).position 

을 아니면 항목 모델의 인스턴스 메서드에서 그것을로 포장 할 수 있습니다 단지 다음과 같이 호출 다음

def position_in_first_catalogue 
    self.catalog_items.find_by_catalogue_id(self.catalogs.first.id).position 
end 

과 :

@item.position_in_first_catalogue 
+1

인스턴스 메서드는 작동하지만 더 나은 방법이 있어야하는 것처럼 보입니다. 특별히 첫 카탈로그를 원했던 것은 아니며 단지 예제로 사용했습니다. 나는 당신이 @ item.position_in_catalog (catalog_id)를 할 수 있다고 생각한다. – arjun

+0

예, @ otem.position_in_catalog (카탈로그)에 대해 다시 작성하는 것은 정말 쉽습니다. 그러나, 나는 당신이 원하는 것을 구현할 수있는 다른 방법을 보지 못합니다. –

+0

@ item.catalogs.first.position <- 이것은 어떤 위치도 전혀 지정하지 않습니다. @ item.catalogs를 사용하면 모든 카탈로그의 하위 집합을 지정하고 첫 번째 카탈로그를 선택할 수 있습니다.결국, 당신이 얻는 방법에 대해 불가지론적인 카탈로그 일뿐입니다. –

-1

연결의 다른 쪽 끝을 제공하면 @ catalog.catalog_item.position을 수행 할 수 있어야합니다.

class Catalog < ActiveRecord::Base 
    belongs_to :catalog_item 
end 

이제 Catalog.first.catalog_item.position을 할 수 있습니다.

+0

catalog_items has_many catalog_items와 has_many items를 통해 catalog_items, 그래서 이것은 내가 뭘 찾고 있었는지는 알 수 없습니다. – arjun

+0

has_many : through에 의해 표현 된 다 대다 관계에 대해서는 작동하지 않습니다. –

-2

왜 당신은 왜 카탈로그를 통해 단지

@item = Item.find(4) 
position = @item.catalog_items.first.position 

을 가야합니까하지? 당신이 처음으로 어떤 카탈로그를 찾고 있기 때문에 그것은 나에게 어떤 의미가되지 않습니다!?

+0

"처음 모든 카탈로그"가 무슨 뜻인지 모르겠습니다. 어쨌든, 저는 처음 카탈로그를 찾는 것이 꼭 필요하지는 않습니다 - 그것은 단지 예일뿐입니다. 아이템에 카탈로그가 50 개 있고 카탈로그 # 6823에 아이템의 위치를 ​​원한다고 가정 해보십시오. – arjun

+0

내 질문에 현재 아이템에 대한 catalog_items의 첫번째 위치가 필요하고 카탈로그는 불필요한 것 같습니다. – aivarsak

+0

catalog_items에서 원하는 위치를 알 수 없습니다. 항목이 50 개의 카탈로그에 속하고 47 번째 카탈로그에서 위치를 원한다면 (그러나 카탈로그의 순서는 모름) 카탈로그가 필요합니다. – arjun