Ruby on Railsの新機能ですが、オンラインで見つけたすべてのソリューションを試してみました。Ruby on Rails:ユーザーがやり取りしていないモデルを選択
ユーザー、トラック、フィードの3つのモデルがあります。
ユーザーはかなり自明です、 トラックは、ユーザーがアップロードすることができた曲です とフィードは、ユーザーがお互いに残すことをフィードバックしている私が持っている
をトラック:
class User < ActiveRecord::Base
has_many :tracks, dependent: :destroy
has_many :feeds
class Track < ActiveRecord::Base
belongs_to :user
has_many :feeds, dependent: :destroy
class Feed < ActiveRecord::Base
belongs_to :track
has_one :user
私が選択する必要がありますユーザーがまだフィードバックを残していないトラック。私は試しました:
Track.joins(:feeds).where("feeds.user_id != #{current_user.id}").where("tracks.user_id != #{current_user.id}")
しかし、それは何も生成されませんでした。
誰かが助けてくれますか?
余分な情報が必要な場合:ユーザーは可能性のフィードバックを残していないどのtracks
を取得するために
class Feed < ActiveRecord::Base
belongs_to :track
belongs_to :user
一つの方法:
User.column_names()
=> ["id", "email", "encrypted_password", "reset_password_token", "reset_password_sent_at", "remember_created_at", "sign_in_count", "current_sign_in_at", "last_sign_in_at", "current_sign_in_ip", "last_sign_in_ip", "created_at", "updated_at", "genre", "name", "genre_id", "slug"]
Track.column_names()
=> ["id", "title", "link", "user_id", "created_at", "updated_at", "slug", "average_feed", "feed_avaliable", "feed_level", "pref_genre", "last_feed"]
Feed.column_names()
=> ["id", "feedback", "user_id", "track_id", "created_at", "updated_at", "overall", "feed_for"]
class PageController < ApplicationController
def feed
@track = Track.joins(:feeds).where("feeds.user_id != #{current_user.id}").where("tracks.feed_avaliable > '0'").where("tracks.user_id != #{current_user.id}").reorder(feed_level: :asc, last_feed: :desc, created_at: :asc).first()
@feed = current_user.feeds.build if user_signed_in?
end
最後に、これは完璧に機能しました。以前はwhere.not機能を使ってみましたが、正しく使用していないはずです。 「Track.idがユーザーに関連付けられたフィードのtrack_idと等しくないトラックを選択する」という基本的なことは、理解していることを確認するだけです。私はそれがそれを言う方法についてのラウンドであることを知っていますが、それは私のコードでは意味があります。 –
内部クエリは、ユーザーに関連付けられたトラックIDのセットです。外部クエリは、内部クエリにidが含まれるすべてのトラックを除外します。助けがあれば、インナークエリーがids '(1,2,3,4)'の明白なリストと同等であると考えることができます。 –