【发布时间】:2016-07-12 01:11:42
【问题描述】:
我在我的应用程序中关注了这个tutorial to create Twitter like following,但是,我的关注不是互惠的,事实上,对方根本没有关注用户。我的两个主要模型是User 和Stock。用户应该能够“关注”股票,但股票永远不会关注用户。
models/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 模型并不真正属于任何人,因此我在该模型中还没有任何东西:
models/stock.rb
class Stock < ActiveRecord::Base
end
为了跟踪 users 即 following 股票,我创建了另一个名为 StockRelationships 的模型:
models/stock_relationship.rb
class StockRelationship < ActiveRecord::Base
belongs_to :user
end
我从控制台开始分配一个用户:
user = User.find(1)
我遇到了麻烦,因为在使用 following_stock? 方法时这似乎不起作用。
我可以创建一个stock_relationship:
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一只股票:
[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 股票时,我遇到了问题:
[13] pry(main)> user.following_stock?(stock)
=> false
应该返回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??我在模型中搞砸了什么吗?
提前致谢!
【问题讨论】:
标签: ruby-on-rails ruby activerecord activemodel