2010-01-06 6 views
0
Article { 
    String categoryName 
    static hasMany = [ 
     tags: Tag 
    ] 
} 

Tag { 
    String name 
} 

이제 관련된 모든 기사의 목록을 찾고 싶습니다. 관련 의미, myArticle과 동일한 카테고리 이름 또는 myArtcle과 동일한 태그를 가진 모든 기사.Grails에서 멋지게 수행하는 방법

카테고리 이름이 일치하는 경우 클로저를 사용하여 relatedArticle을 얻는 방법은 다음과 같습니다.

def relatedArticles = Article.list().find {it.categoryName == myArticle.categoryName } 

누구나 범주 이름 또는 태그 이름 (그루비 방식)으로 모든 기사를 찾을 수있는 기회를 원하십니까?

기준 또는 사용자 지정 쿼리를 사용하는 모든 솔루션도 감사합니다.

답변

1

이 작동합니다 :

def myArticle = // the article you want to match 

def relatedArticles = Article.list().findAll { 
    (it.categoryName == myArticle.categoryName || 
      it.tags.name.intersect(myArticle.tags.name)) && 
      it.id != myArticle.id)    
} 

을하지만,이 기사의 합리적 수가 많은 단지 그들 중 소수가 끔찍하게 비효율적 일치 할 것으로 예상되는 경우,이 모든 기사를로드로 그들 모두를 통해 반복을 반복합니다.

더 좋은 방법은 당신이 기준 쿼리를 사용하는 것, 단순히에만로드

+0

성능 문제에 동의합니다. 나는 단지 약 50 개의 기사를 가지고 있으며 그것은 많이 증가하지 않을 것입니다. – Langali

+0

코드는 원래 카테고리 AND 태그와 일치하도록 작성되었으므로 질문을 다시 읽고 범주 OR 태그와 일치하도록 코드를 변경했습니다. –

+0

이제 문자열에 대해 intersect() 메서드를 호출하고 있습니까? – Langali

-1

이상적 (대신 Article.list()를 호출하는) 기사를 일치하는 쿼리를 작성, 버그 당신이 성능에 대해 우려하지 않은 말했다 때문에, 뭔가 될 것 같은이 작동합니다 :

def category = 
def tagName 

def relatedArticles = Article.list().findAll { 
    (it.categoryName == myArticle.categoryName) || (it.tags.contains(tagName))    
} 
+0

기사에 태그가 두 개 이상 있습니다. 그러면 여러 태그에 대한 작업이 어떻게 포함됩니까? – Langali

+0

또한 기준을 사용하여 솔루션에 관심이 있습니다. 시도하고 싶니? – Langali

+0

귀하의 질문에 "카테고리 이름 또는 태그 이름으로 모든 기사 찾기"라는 질문에 답변했습니다. –

0

을 당신이 기사 태그마다 별도의 쿼리를 사용할 필요가 있다고 생각 :

// Use a LinkedHashSet to retain the result order if that is important 
def results = new LinkedHashSet() 

results.addAll(Article.findAll("from Article as article \ 
    where article.categoryName = :categoryName \ 
    and article.id != :id", 
    [ 
    categoryName:myArticle.categoryName, 
    id:myArticle.id, 
    ]) 

myArticle.tags.each { 
results.addAll(Article.executeQuery(
    "select distinct article from Article as article, \ 
    Tag as tag \ 
    where tag.name = :tag \ 
    and tag in elements(article.tags) \ 
    and article.id != :id", 
    [ 
    tag:it.name, 
    id:myArticle.id, 
    ])) 
} 

def relatedArticles = results as List 

이를 시스템에 많은 콘텐츠가 있고 단일 페이지 요청에 대해 전체 데이터베이스를로드하지 않으려 고 할 때 분명히 가치가 있습니다. 다른 개선점으로는 쿼리에 max 및 offset 매개 변수를 지정하는 것입니다.

관련 문제