Ruby on rails RoR ActiveRecord连接帮助或替代查询

Ruby on rails RoR ActiveRecord连接帮助或替代查询,ruby-on-rails,activerecord,Ruby On Rails,Activerecord,正在开发RoR应用程序。想一想用一点基本的人工智能为艺术打火机。当你喜欢或不喜欢艺术时,该应用程序将根据其他用户的喜好向你展示你希望更喜欢的艺术。我正在编写代码,以选择下一个要显示的图像 我使用以下模型: 基本用户信息: class User < ApplicationRecord has_many :artworks has_many :artists has_many :art_views end 但它不起作用 相反,我现在正试图“一步一步”地做这件事,并试图找到具有类似

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

我使用以下模型:

基本用户信息:

class User < ApplicationRecord
  has_many :artworks
  has_many :artists
  has_many :art_views
end
但它不起作用

相反,我现在正试图“一步一步”地做这件事,并试图找到具有类似要求的ArtView:

查找用户喜欢的特定用户id的艺术视图,但不包括其他指定用户id看到的艺术

我正在尝试以下代码,但似乎不起作用:

@artview = ArtView.where(user_id: @similarUser, liked: true).where.not(user_id: @current_user.id)

任何帮助(无论是固定连接或固定周围的工作)将不胜感激。谢谢你

我能够使用一个范围解决这个问题,这个范围是我在这里进行更多挖掘的基础上拼凑而成的(但我丢失了另一个答案所在的标签,所以很遗憾,我无法为你参考)

我在ArtView模型中添加了以下作用域:

scope :all_except_user, ->(user) { where.not(user_id: user) }
scope :all_except_art, ->(artwork) { where.not(artwork_id: artwork) }
然后我在控制器中使用了以下代码:

@lastViewed = ArtView.where(user_id: @id, liked: true).last
@artwork_id = @lastViewed.artwork_id
@allViewed = ArtView.where(user_id: @id)
@similarUsers = ArtView.where(artwork_id: @artwork_id, liked: true).all_except_user(@id) 
@similarUser = @similarUsers.first
@similarUserId = @similarUser.user_id
@alreadyViewedArt = Artwork.joins(:art_views).where(:art_views => { :user_id => @id})
@similarArtworks = ArtView.where(user_id: @similarUserId, liked: true).all_except_art(@alreadyViewedArt.ids)
@nextArtwork = @similarArtworks.first
@art = Artwork.find(@nextArtwork.id)

我确信有更有效的方法来编写这段代码,但至少它是有效的,而且我可以在将来的某个时候通过适当的连接使它更有效。希望这个答案能对其他人有所帮助。

我可以使用一个范围来解决这个问题,这个范围是我在这里进行更多挖掘的基础上拼凑而成的(但我丢失了另一个答案所在的标签,所以很遗憾,我无法为您参考)

我在ArtView模型中添加了以下作用域:

scope :all_except_user, ->(user) { where.not(user_id: user) }
scope :all_except_art, ->(artwork) { where.not(artwork_id: artwork) }
然后我在控制器中使用了以下代码:

@lastViewed = ArtView.where(user_id: @id, liked: true).last
@artwork_id = @lastViewed.artwork_id
@allViewed = ArtView.where(user_id: @id)
@similarUsers = ArtView.where(artwork_id: @artwork_id, liked: true).all_except_user(@id) 
@similarUser = @similarUsers.first
@similarUserId = @similarUser.user_id
@alreadyViewedArt = Artwork.joins(:art_views).where(:art_views => { :user_id => @id})
@similarArtworks = ArtView.where(user_id: @similarUserId, liked: true).all_except_art(@alreadyViewedArt.ids)
@nextArtwork = @similarArtworks.first
@art = Artwork.find(@nextArtwork.id)
我确信有更有效的方法来编写这段代码,但至少它是有效的,而且我可以在将来的某个时候通过适当的连接使它更有效。希望这个答案能帮助其他人

@lastViewed = ArtView.where(user_id: @id, liked: true).last
@artwork_id = @lastViewed.artwork_id
@allViewed = ArtView.where(user_id: @id)
@similarUsers = ArtView.where(artwork_id: @artwork_id, liked: true).all_except_user(@id) 
@similarUser = @similarUsers.first
@similarUserId = @similarUser.user_id
@alreadyViewedArt = Artwork.joins(:art_views).where(:art_views => { :user_id => @id})
@similarArtworks = ArtView.where(user_id: @similarUserId, liked: true).all_except_art(@alreadyViewedArt.ids)
@nextArtwork = @similarArtworks.first
@art = Artwork.find(@nextArtwork.id)