0

我有一个 API,其中我在角色和电影之间建立了 HABTM 关系(一部电影有很多角色,一个角色有很多电影)。我正在尝试使用 has_scope gem 设置过滤器,这样我就可以做类似 的事情/api/characters?by_movie=:movie_id,而不是从我的 CharactersController 中的索引中获取所有角色,我只获取参与特定电影的角色。建立关系的方式允许我执行类似Characters.find(1).movies-> 返回该角色的电影列表的操作。如果我向角色发送 POST 并且我想向其中添加电影,我可以像“movie_ids”:[1,2] 那样做。

我试过这种方法没有成功:

在我的 Character.rbscope :by_movie, -> id, {where(movie_ids: id)}scope :by_movie, -> id, {where(movies: id)}我的控制器中:has_scope :by_movie, using: :id

has_scope 中的文档很少,我无法找到我的具体问题,希望你们中的一些人能帮助我,谢谢。

4

1 回答 1

0

好吧,我想通了(有点)

应用程序/模型/movie.rb

has_and_belongs_to_many :genres

scope :by_genre, -> (genres) {
   genre_array = genres.split(',') # this turns the genre string into an array
   joins(:genres).where(genres: genre_array) # this joins the genres table to our movies model, these tables are related already by a HABTM relationship.
}

在我们的 app/controllers/movies_controller.rb

has_scope :by_genre

@movies = apply_scopes(Movie).all

我唯一不能解决的问题是,如果我通过了让我们说

localhost:3000/studios/movies?by_genre=1,2,3 #This is what your GET should look like. 1, 2 and 3 are the id's of the Genres the movie has.

假设一部电影具有所有三种类型,所以当我发送这个时,我会得到一部电影三遍的结果,而不仅仅是一个结果。因此,不是将我们的genres_array 与genre_ids 数组进行比较,而是将genres_array 的每个元素与genre_ids 进行比较,一次一个。我还没能解决这个问题。

于 2021-04-22T20:03:24.873 回答