Twitter 点赞 Rails

Twitter like following in Rails

我在我的应用程序中关注这个 tutorial to create Twitter like following,但是,我的关注不是相互的,事实上,另一方根本不关注用户。我的两个主要模型是 UserStock。用户应该能够 '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

为了跟踪 usersfollowing 个股票,我创建了另一个名为 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