私のアプリではこのtutorial to create Twitter like followingと一緒にフォローしていますが、私の次は相反的ではありません。私の2つの主要なモデルはUser
とStock
です。ユーザーは株を「追う」ことができるはずですが、株はユーザーに従うことはありません。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?
を実装していますか?私は私のモデルで何かを台無しにしましたか?
ありがとうございます!
それで、両方の答えがうまくいきます。どちらがDB上でより効率的ですか? – Godzilla74
'stock_relationships.where(stock_id:stock.id).present?'あなたの 'stock_id'カラムを索引付けしていれば、 – oreoluwa
@oreoluwa存在のみをテストしている場合は、 '.exists?'がさらに優れています。 ;) – coreyward