2015-12-30 58 views
2

這個問題最好通過一個例子來演示。我有2個Sequel模型,ArtistsGenres,通過一個木匠表通過許多一對多關係連接:續集模型過濾多對多關係

class Artist < Sequel::Model 
    many_to_many :genres, 
    left_key: :artist_id, 
    right_key: :genre_id, 
    join_table: :artists_genres 
end 

class Genres < Sequel::Model 
    many_to_many :artists, 
    left_key: :genre_id, 
    right_key: :artist_id, 
    join_table: :artists_genres 
end 

而且木匠表看上去很簡單:

CREATE TABLE `artists_genres` (`artist_id` integer, `genre_id` integer) 

我想什麼做的是過濾所有屬於特定流派的藝術家。使用單一類型時,這工作得很好:

some_genre = Genre[1] 
Artists.dataset.where(:genres => some_genre).all 

我的問題是試圖讓誰屬於流派的集合所有的藝術家:

multiple_genres = Genre.where(:id => [1,2,4]) 
Artists.dataset.where(:genres => multiple_genres).all 

這將返回誰屬於任何3個流派的藝術家(1,2或4),而不是屬於所有3種流派的藝術家。

什麼是通過模型查詢它的正確方法,或者重寫爲數據集join調用來選擇正確的行?

+2

只是一個猜測:會不會'Artists.dataset.where(類型:1)。凡(類型2)。凡(流派:4)'工作? – mudasobwa

回答

1

正如在評論中提到@mudasobwa,可以追加多個where方法

multiple_genres = Genre.where(id: [1, 2, 4]) 
result = Artists.dataset 
multiple_genres.each { |g| result = result.where(genres: g) } 
result.all