我的问题可以说明如下:
我有三个模型,用户,流派和音乐会。User
和Concert
的示例都可以与任意数量的genres
相关联,因此它们与Genre
具有连接表,具有has_and_belongs_to_many关系。
我的目标是实现一个过滤器,该过滤器将接受User
的一个示例,并返回与一个或多个genres
关联的Concert
的每个示例,这些genres
与所述User
相同。
我的代码:
- #音乐会.rb:*
class Concert < ApplicationRecord
has_and_belongs_to_many :genres
end
- #用户.rb:*
class User < ApplicationRecord
has_and_belongs_to_many :genres
end
- #架构.rb:*
create_table "genres_concerts", id: false, force: :cascade do |t|
t.bigint "genre_id", null: false
t.bigint "concert_id", null: false
end
create_table "genres_users", id: false, force: :cascade do |t|
t.bigint "genre_id", null: false
t.bigint "user_id", null: false
t.index ["genre_id", "user_id"], name: "index_genres_users_on_genre_id_and_user_id"
t.index ["user_id", "genre_id"], name: "index_genres_users_on_user_id_and_genre_id"
end
因此,我可以在任一示例上调用.genres
,例如,User.find(1).genres
返回
[#<Genre:0x00000001086f1068 id: 440, name: "rock", created_at: Thu, 17 Nov 2022 01:51:38.092415000 UTC +00:00, updated_at: Thu, 17 Nov 2022 01:51:38.092415000 UTC +00:00>,
#<Genre:0x00000001086f0bb8 id: 444, name: "jazz", created_at: Thu, 17 Nov 2022 01:51:38.115169000 UTC +00:00, updated_at: Thu, 17 Nov 2022 01:51:38.115169000 UTC +00:00>,
#<Genre:0x00000001086f0ac8 id: 418, name: "electronica", created_at: Thu, 17 Nov 2022 01:50:49.304427000 UTC +00:00, updated_at: Thu, 17 Nov 2022 01:50:49.304427000 UTC +00:00>]
和Concert.find(1).genres
返回
[#<Genre:0x00000001086f1068 id: 440, name: "rock", created_at: Thu, 17 Nov 2022 01:51:38.092415000 UTC +00:00, updated_at: Thu, 17 Nov 2022 01:51:38.092415000 UTC +00:00>,
#<Genre:0x00000001086f1bc8 id: 469, name: "punk", created_at: Thu, 17 Nov 2022 01:50:49.304427000 UTC +00:00, updated_at: Thu, 17 Nov 2022 01:50:49.304427000 UTC +00:00>]
在上面的例子中,使用id: 1
的用户与名为“摇滚”、“爵士”和“电子音乐”的流派相关联,所以我会查找与这些流派相关联的每个Concert
。
经过相当多的阅读和搜索,我仍然坚持试图找出这一个,所以任何输入是非常感谢。提前感谢!
1条答案
按热度按时间pgx2nnw81#
我会尝试以下方法:
并像这样使用它:
请注意,由于数据库连接的性质,可能会返回重复的音乐会,因此需要
distinct
。