2016-05-10 4 views
0

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 

答えて

-1

まず、ムハンマドが正しく指摘したように、Feedべきbelongs_toUser、ないhas_one

class Feed < ActiveRecord::Base 
    belongs_to :track 
    belongs_to :user 
end 

この例では、のは、ユーザーが42のIDを持っているとしましょう

Track.where.not(id: current_user.feeds.select(:track_id)) 

レール4に導入さ where.not機能を使用しています。これは生成する必要があります

SELECT tracks.* FROM tracks WHERE tracks.id NOT IN (
    SELECT feeds.track_id FROM feeds WHERE feeds.user_id = 42 
) 

一般的に、SQLクエリでは文字列補間をしないでください。安全に行うにはいくつかの方法がありますが、この場合はrubyインターフェースを使うだけです。

これはIDにpluckよりも優先されます。これは、DBへの2回の往復を必要とするためです。一方、このようなサブクエリは1つだけ必要です。しかし、いつものように、クエリーのプロファイルを立てて速くて、必要なインデックスを確認する必要があります。

+0

最後に、これは完璧に機能しました。以前はwhere.not機能を使ってみましたが、正しく使用していないはずです。 「Track.idがユーザーに関連付けられたフィードのtrack_idと等しくないトラックを選択する」という基本的なことは、理解していることを確認するだけです。私はそれがそれを言う方法についてのラウンドであることを知っていますが、それは私のコードでは意味があります。 –

+0

内部クエリは、ユーザーに関連付けられたトラックIDのセットです。外部クエリは、内部クエリにidが含まれるすべてのトラックを除外します。助けがあれば、インナークエリーがids '(1,2,3,4)'の明白なリストと同等であると考えることができます。 –

0

まずUserモデルなどでFeedモデルの関係を修正します:

track_ids = current_user.feeds.pluck(:track_id).uniq 
@tracks = Track.where("id NOT IN (?)", track_ids) 

ヨーユーザーがフィードバックを得ていないトラックが表示されます。

関連する問題