2016-07-12 9 views
0

私のアプリではこのtutorial to create Twitter like followingと一緒にフォローしていますが、私の次は相反的ではありません。私の2つの主要なモデルはUserStockです。ユーザーは株を「追う」ことができるはずですが、株はユーザーに従うことはありません。Twitterのような次のようなメッセージが表示されます

モデル/ user.rb

class User < ActiveRecord::Base 

    has_many :stock_relationships 
    has_many :stocks, through: :stock_relationships, source: :user 

    devise :database_authenticatable, :registerable, 
     :recoverable, :rememberable, :trackable, :validatable, 
     :omniauthable, :omniauth_providers => [:facebook, :twitter, :linkedin, :google_oauth2] 

    # stock following/unfollowing 
    def follow_stock(stock) 
    stock_relationships.create(stock_id: stock.id) 
    end 

    def unfollow_stock(stock) 
    stock_relationships.find_by(stock_id: stock.id).destroy 
    end 

    def following_stock?(stock) 
    stock_relationships.include?(stock.id) 
    end 

end 

Stockモデルは本当に誰にも属していないので、私はまだそのモデルには何もありません:

モデル/ stock.rb

class Stock < ActiveRecord::Base 

end 

following銘柄ですusersを追跡するために、私は別のモデルがStockRelationshipsと呼ばれる作成しました:

モデル/ stock_relationship.rb

class StockRelationship < ActiveRecord::Base 
    belongs_to :user 
end 

私は、コンソールでオフ始めていますユーザーを割り当てる:

user = User.find(1) 

これは問題ではありませんfollowing_stock?メソッドを使用するときに動作するようにしてください。

pry(main)> user.follow_stock(stock) 
    (0.2ms) BEGIN 
    SQL (2.2ms) INSERT INTO "stock_relationships" ("stock_id", "user_id", "created_at", "updated_at") VALUES ($1, $2, $3, $4) RETURNING "id" [["stock_id", 2], ["user_id", 1], ["created_at", "2016-07-12 01:01:00.552580"], ["updated_at", "2016-07-12 01:01:00.552580"]] 
    (2.5ms) COMMIT 
=> #<StockRelationship:0x007ff0b960ba60 
id: 3, 
user_id: 1, 
stock_id: 2, 
created_at: Tue, 12 Jul 2016 01:01:00 UTC +00:00, 
updated_at: Tue, 12 Jul 2016 01:01:00 UTC +00:00> 

と私のことができunfollow株式:

私はstock_relationshipを作成することができますしかし

[10] pry(main)> user.unfollow_stock(stock) 
    StockRelationship Load (0.4ms) SELECT "stock_relationships".* FROM "stock_relationships" WHERE "stock_relationships"."user_id" = $1 AND "stock_relationships"."stock_id" = $2 LIMIT 1 [["user_id", 1], ["stock_id", 2]] 
    (0.1ms) BEGIN 
    SQL (0.3ms) DELETE FROM "stock_relationships" WHERE "stock_relationships"."id" = $1 [["id", 3]] 
    (1.5ms) COMMIT 
=> #<StockRelationship:0x007ff0b9d36a60 
id: 3, 
user_id: 1, 
stock_id: 2, 
created_at: Tue, 12 Jul 2016 01:01:00 UTC +00:00, 
updated_at: Tue, 12 Jul 2016 01:01:00 UTC +00:00> 

私は、ユーザーがあるかどうかをチェックしていたとき、私が問題に実行していますよ実際following株式:RETれるべき

[13] pry(main)> user.following_stock?(stock) 
=> false 

ユーザーからurning trueは、株式、次の事実である:

[15] pry(main)> StockRelationship.all 
    StockRelationship Load (0.4ms) SELECT "stock_relationships".* FROM "stock_relationships" 
=> [#<StockRelationship:0x007ff0bfa00408 
    id: 2, 
    user_id: 1, 
    stock_id: 1, 
    created_at: Tue, 12 Jul 2016 00:32:55 UTC +00:00, 
    updated_at: Tue, 12 Jul 2016 00:32:55 UTC +00:00>, 
#<StockRelationship:0x007ff0bfa002c8 
    id: 4, 
    user_id: 1, 
    stock_id: 2, 
    created_at: Tue, 12 Jul 2016 01:04:06 UTC +00:00, 
    updated_at: Tue, 12 Jul 2016 01:04:06 UTC +00:00>] 

私が間違ってinclude?を実装していますか?私は私のモデルで何かを台無しにしましたか?

ありがとうございます!

答えて

0

エラーは、データ型の比較の問題です。これを試してみてください:

def following_stock?(stock) 
    # either use this 
    stock_relationships.where(stock_id: stock.id).present? 
    # OR 
    stock_relationships.pluck(:stock_id).include?(stock.id) 
    end 
+0

それで、両方の答えがうまくいきます。どちらがDB上でより効率的ですか? – Godzilla74

+0

'stock_relationships.where(stock_id:stock.id).present?'あなたの 'stock_id'カラムを索引付けしていれば、 – oreoluwa

+0

@oreoluwa存在のみをテストしている場合は、 '.exists?'がさらに優れています。 ;) – coreyward

0

私はこの現時点でテストできるコンピュータではありませんが、あなたのコードを見ても、has_many throughの関係で原因がsource宣言になる可能性があるという疑惑が疑われます。あなたのUserモデルで

は、あなたは私が関係の User側から検索を user_idない stock_idのための関係を見て作っていると信じて source: :userを持っています。

source: :stockに変更したい場合や、モデル名と関係が同じである場合は、source割引を完全に省いてもよい場合があります。

+0

'ソースを処分した:私は' user.follow_stock(株) 'で別の株式に従った後も、まだかかわらずfalseを返し、完全にuser'。 – Godzilla74

+0

私はちょうど別の問題を発見したかもしれないと思うかもしれません。あなたの次の株式メソッドでは、コレクションで '.include? 'を呼び出していますが、idだけを渡しています。オブジェクト全体をパラメータとして渡すか、 (おそらくそれを次のように変更してください: 'stock_relationships.map(&:stock_id).include?(stock.id)' –

+1

oreoluwasを受け入れることが自由に感じられます。より効率的であれば、私はテストするポジションは現時点で、私の頭の上から知識を持っていないので、ちょうど助けるためにここにいるのです!私はちょうどあなたが将来のある時点であなたをかわすために戻って来るかもしれないbeauseにその 'ソース'の問題を世話することを確認するために追加しますが! :) –

関連する問題