1

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

我怎样才能做到这一点?请帮我。

4

2 回答 2

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

当然,您需要添加相应的路由以将其全部连接起来,并为 and 编写index视图game。也许您会在您的朋友列表中放置指向该create操作的链接,以便人们可以提出挑战。

请注意我是如何完成所有事情的,current_user.received_challenges而不是仅仅做一个基本的Challenge.find(params[:id])——如果你这样做了,任何人都可以通过猜测 id 来接受挑战!哎呀!

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

于 2013-01-10T10:45:05.137 回答
0

has_many :through已经有了关系?

您需要将 a 传递: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你可以解决你的问题!

于 2013-01-10T10:06:12.197 回答