RoR ActiveRecord Join Help for semi AI App

RoR ActiveRecord Join Help for semi AI App

正在开发 RoR 应用程序。将 Tinder 视为带有一点基本 AI 的艺术作品。当您喜欢或不喜欢艺术时,该应用程序会根据其他用户的喜好向您展示您希望更喜欢的艺术。我正在编写代码以选择要显示的下一张图片。

我使用以下型号:

基本用户信息:

class User < ApplicationRecord
  has_many :artworks
  has_many :artists
  has_many :art_views
end

关于每件作品的信息(价格、高度、宽度等)

class Artwork < ApplicationRecord
  belongs_to :user
  belongs_to :artist
  has_many :art_views
end

表示向用户展示了哪些艺术作品(boolean liked 表示用户是否喜欢该艺术作品)

class ArtView < ApplicationRecord
  belongs_to :user
  belongs_to :artwork
end

逻辑很简单:在找到 current_user 喜欢的最后一个作品后(在 ArtView 中),找到其他也喜欢相同作品的用户(也在 ArtView 中),然后找到其他用户喜欢的新作品未被 current_user 看到(ArtView 中无记录)

我正在使用以下连接:

@artwork = Artwork.joins(:artview)
  .where(:artviews => { :liked => true})
  .where(:artviews => { :artwork_id => @artwork_id})
  .where.not(:artviews => { user_id: @id })

我收到以下错误:

Can't join 'Artwork' to association named 'artview'; perhaps you misspelled it?

非常感谢任何 guidance/suggestions(都在修复错误 and/or 改进逻辑,总的来说)

一个ArtView有很多个ArtView,所以在使用的时候要参考那个关系joins

它应该像这样工作:

Artwork.joins(:art_views)

同样在使用joined列时(不管是那种关系),你应该使用table的“真实”名称;它是复数形式——这就是 Rails 命名它创建的 table 的方式,除非另有说明:

Artwork
  .joins(:art_views)
  .where(:art_views => { :liked => true})
  .where(:art_views => { :artwork_id => @artwork_id})
  .where.not(:art_views => { user_id: @id })