首页 > 解决方案 > RoR ActiveRecord 半人工智能应用程序加入帮助

问题描述

使用 RoR 应用程序。用一点基本的人工智能想想艺术的 Tinder。当您喜欢或不喜欢艺术时,该应用程序会根据其他用户的喜好向您展示您希望更喜欢的艺术。我正在编写代码以选择下一个要显示的图像。

我使用以下模型:

基本用户信息:

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

表示向用户展示了哪些艺术品(布尔值表示用户是否喜欢艺术品)

class ArtView < ApplicationRecord
  belongs_to :user
  belongs_to :artwork
end

逻辑很简单:在找到 current_user (在 ArtView 中)喜欢的最后一个 Artwork 之后,找到也喜欢相同 Artwork 的其他用户(也在 ArtView 中),然后找到那些其他用户喜欢的新 Artwork 还没有被 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?

非常感谢任何指导/建议(通常在修复错误和/或改进逻辑方面)

标签: ruby-on-railsactiverecord

解决方案


一个 ArtView 有很多 ArtView,所以在使用joins.

它应该像这样工作:

Artwork.joins(:art_views)

使用joined 列时相同(无论是哪种关系),都应该使用表的“真实”名称;它是复数形式——这就是 Rails 命名它创建的表的方式,除非另有说明:

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

推荐阅读