如何在rails应用程序中创建类似于Facebook的用户和朋友之间的挑战?

时间:2013-01-10 09:57:27

标签: ruby-on-rails ruby-on-rails-3

我有一个用户有朋友列表的rails应用程序。现在我必须创建一个类似于facebook挑战的挑战,用户可以完成这个过程(玩游戏),他可以挑战他的朋友,他的朋友可以接受或拒绝请求,如果被接受,在完成过程(玩游戏)之后必须发送包含谁赢得的用户的消息。

我该怎么做?请帮帮我。

2 个答案:

答案 0 :(得分:2)

听起来你想要一个名为Challenge的新模型。这可能有几个关联:

class Challenge < ActiveRecord::Base
  belongs_to :sender, class_name: "User", inverse_of: :sent_challenges
  belongs_to :receiver, class_name: "User", inverse_of: :received_challenges
end

User上的相应关联可能是

class User < ActiveRecord::Base
  # ...
  has_many :sent_challenges,
    class_name: "Challenge", foreign_key: "sender_id", inverse_of: :sender

  has_many :received_challenges,
    class_name: "Challenge", foreign_key: "receiver_id", inverse_of: :receiver
end

然后,您可以在User上发送一个方法来发送挑战

def send_challenge(friend)
  sent_challenges.create(receiver: friend)
end

您可能在ChallengesController上执行了一些操作:

def index
  @challenges = current_user.received_challenges
end

def create
  @challenge = current_user.send_challenge(params[:friend_id])
  # now the sender plays the game
  render :game
end

def accept
  @challenge = current_user.received_challenges.find(params[:id])
  # now the receiver plays the game
  render :game
end

def deny
  current_user.received_challenges.destroy(params[:id])
  redirect_to challenges_url
end

def complete
  # happens at the end of the game
  # work out the winner
  # send the emails
end

当然,您需要添加相应的路由以将其全部挂起,并为indexgame写入视图。也许你会在朋友列表中放置指向create行动的链接,以便人们可以发出挑战。

请注意我是如何通过current_user.received_challenges而不是仅仅执行基本Challenge.find(params[:id]) - 如果您这样做的话,任何人只能通过猜测ID来接受挑战!糟糕!

我说“也许”和“可能”很多,因为有不同的方法可以解决这个问题。但我希望这足以让你开始。如果没有,我建议尝试Rails教程 - Michael Hartl's是经典的。

答案 1 :(得分:0)

您是否已获得has_many :through关系?

您需要将:source传递给users表,因为用户也可以是朋友。这看起来像这样:

class User < ActiveRecord::Base
 has_many :friends
 has_many :users, :source => :friend, :through => :friends
end

PS:您需要为friends表创建迁移并运行它。

可以在连接表中添加更多列(朋友)。在那里你可以添加relationship_status。所以你最终得到了:

朋友表

ID | User_id | Friend_id | relationship_status

根据relationship_status您可以解决您的问题!