Twitter 点赞 Rails
Twitter like following in Rails
我在我的应用程序中关注这个 tutorial to create Twitter like following,但是,我的关注不是相互的,事实上,另一方根本不关注用户。我的两个主要模型是 User
和 Stock
。用户应该能够 'follow' 股票,但股票永远不会跟随用户。
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 (, , , ) 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" = AND "stock_relationships"."stock_id" = LIMIT 1 [["user_id", 1], ["stock_id", 2]]
(0.1ms) BEGIN
SQL (0.3ms) DELETE FROM "stock_relationships" WHERE "stock_relationships"."id" = [["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?
不正确吗?我在我的模型中搞砸了什么吗?
提前致谢!
此时我不在可以测试的计算机旁,但是查看您的代码,我偷偷怀疑原因可能是您 has_many 中的 source
声明通过关系。
在您的用户模型中,您有 source: :user
,我认为这使关系在从 User
端搜索时寻找 user_id
而不是 stock_id
关系。
您可能想将其更改为 source: :stock
,或者在您的情况下,由于模型名称和关系相同,您可以完全省略 source
减法。
您的错误是数据类型比较问题。试试这个:
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
我在我的应用程序中关注这个 tutorial to create Twitter like following,但是,我的关注不是相互的,事实上,另一方根本不关注用户。我的两个主要模型是 User
和 Stock
。用户应该能够 'follow' 股票,但股票永远不会跟随用户。
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 (, , , ) 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" = AND "stock_relationships"."stock_id" = LIMIT 1 [["user_id", 1], ["stock_id", 2]]
(0.1ms) BEGIN
SQL (0.3ms) DELETE FROM "stock_relationships" WHERE "stock_relationships"."id" = [["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?
不正确吗?我在我的模型中搞砸了什么吗?
提前致谢!
此时我不在可以测试的计算机旁,但是查看您的代码,我偷偷怀疑原因可能是您 has_many 中的 source
声明通过关系。
在您的用户模型中,您有 source: :user
,我认为这使关系在从 User
端搜索时寻找 user_id
而不是 stock_id
关系。
您可能想将其更改为 source: :stock
,或者在您的情况下,由于模型名称和关系相同,您可以完全省略 source
减法。
您的错误是数据类型比较问题。试试这个:
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