【问题标题】:Adding foreign keys to rails database将外键添加到 Rails 数据库
【发布时间】:2012-03-07 01:20:35
【问题描述】:

我现在有一个问题,不知道该怎么办。这是 关于表之间的关系以及我是否需要外国 键。

我的数据库中有两个表;用户和游戏。用户包括所有 用户信息(用户名、电子邮件、地址、密码等) 游戏 包括所有游戏信息(名称、流派、控制台用户 ID)。作为 您可能已经注意到游戏桌包含用户 ID,以便 将两者之间的关系联系起来,这是每场比赛都需要一个 关联用户。

我想做的是在每个游戏 show.html.erb 页面上,我有一个按钮 它应该向该游戏的所有者发送一封电子邮件,以便让 他们现在因为当前登录的用户有兴趣交易 游戏。

我想知道我将如何做到这一点。 user_id 是否自动链接 所有用户关联的数据或只是 id。如果不是那我怎么办 将用户电子邮件声明为外键,以便我调用 要发送给用户的电子邮件?

任何帮助将不胜感激。谢谢

克里斯托弗·琼斯

更新

嘿,我的 games_controller 显示部分中有以下内容,但它不起作用。它抛出以下错误:“chris230391@googlemail.com”的未定义方法`email':String。

def show
@game = Game.find(params[:id])

respond_to do |format|
  GameTrade.game_interest(@game.user.email).deliver
  format.html { redirect_to root_url }
  format.json { render json: @game }
end
end

所以我将其更改为以下内容,以分解问题并找出问题所在的行,并指出该块位于第 19 行,即行 g = GameTrade.game_interest(email)。我收到以下错误:

“chris230391@googlemail.com”的未定义方法“电子邮件”:字符串

有什么想法吗?代码如下

def show
  @game = Game.find(params[:id])

respond_to do |format|
  user = @game.user
  email = user.email
  g = GameTrade.game_interest(email)
  g.deliver
  format.html { redirect_to root_url }
  format.json { render json: @game }
end
end

以下代码是我在邮件部分中的 Game_trade.rb 的代码:

  class GameTrade < ActionMailer::Base
    default :from => "christopher@aol.com"

    def game_interest(user)
      @user = user
      mail :to => user.email, :subject => "Game Interest"
    end
   end

【问题讨论】:

  • 您是在谈论数据库中的真实 FK 还是某些 Rails 关联的 :foreign_key 选项?
  • 嘿,我想放置一个外键,这样当我单击按钮时,它会向用户的电子邮件地址发送一封电子邮件。游戏表中不存在电子邮件字段,只有用户和我在游戏中有 user_id,但我不认为这可以访问用户电子邮件。
  • 嘿,我已经更新了我上面的问题,以便更深入地了解我想要做什么。

标签: mysql ruby-on-rails migration foreign-keys


【解决方案1】:

看看this Stack Overflow question regarding Rails and referential integrity。您可能需要查看 foreigner gem 以在 Rails 迁移期间添加和删除外键。

但是,我很好奇您为什么要创建超出游戏->用户约束的外键约束。您是否有理由对用户名和电子邮件字段进行非规范化?

【讨论】:

  • 我需要在每个游戏中引入用户电子邮件的原因是因为我需要游戏区域中的一个按钮,如果您单击它,它将向与该电子邮件地址关联的用户发送一封电子邮件.这对你有意义吗?
  • 嘿,我已经更新了我上面的问题,以便更深入地了解我希望做什么。
  • 如果你正确设置了关系,那么你可以调用game.user.email——即获取与Game关联的User记录,然后获取email的属性那User。如果你将用户的电子邮件地址直接放在游戏中,当用户更新他的电子邮件时会发生什么?您现在必须更新与该用户关联的每个游戏,而不是单个 User 记录。
  • 这很有意义 Brandan,我已经更新了我上面的问题,进一步了解了我在过去几个小时内所做的事情。
  • 您的game_interest 方法需要User 类型的参数,但您使用@game.user.email 调用它,它是一个字符串。
【解决方案2】:

线路GameTrade.game_interest(@game.user.email).deliver
调用 GameTrade 模型中的 game_interest 方法。
(请同时发布该代码。)

此方法需要一个参数,但它没有得到它。

我也会考虑将方法和调用都设为 for
game_interest_deliver(@game.user.email).

我在 sql 数据仓库工作了 5 年,一开始我对 rails 和外键很困惑。我学到的主要教训不是适当地添加它们,而是更多地关注 ruby​​ 代码、模型和方法以实现正确的结果。

【讨论】:

  • 嘿,迈克尔,我已经更新了我的帖子,在底部添加了 Game_trade 的邮件类。
  • OP 对ActionMailer 使用了正确的约定。您的“通知”方法返回一个Mail::Message 对象(调用mail 的结果),然后调用该对象上的deliver 以发送消息。我也认为将User 对象传递给该方法是正确的,以便视图可以使用它,该视图负责构建电子邮件消息本身。
  • 看起来一切正常,但是当我尝试单击游戏的显示页面时收到此错误消息:“chris230391@googlemail.com”的未定义方法“电子邮件”:字符串。从外观上看,它不会让我称之为它,因为它是一个字符串而不是一个对象。我该如何解决?
猜你喜欢
  • 2011-10-07
  • 2016-07-03
  • 2021-07-05
  • 2020-12-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-10
  • 1970-01-01
相关资源
最近更新 更多