续集模型过滤多对多关系

时间:2015-12-30 10:25:48

标签: ruby sequel

通过一个例子可以最好地证明这个问题。我有两个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调用以选择正确的行?

1 个答案:

答案 0 :(得分: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