rails关联是否会阻止创建新记录,就像SQL create table上的foreign_key一样?

时间:2014-05-08 08:02:46

标签: sql ruby-on-rails associations model-associations

我知道这是一个非常简单的问题,但我无法在任何地方找到任何澄清。

所以,如果我有:

class Task < ActiveRecord::Base
    belongs_to :group
end

class Group < ActiveRecord::Base
    has_many :tasks
end

如果创建任务时给出的group_id在组中不存在,这是否会阻止创建新任务记录?

因为我已经尝试了这个并且它不会阻止我这样做,这与SQL表上的实际foreign_key属性不同(rails不会添加到其表中)

2 个答案:

答案 0 :(得分:0)

不,不会 - 设置foreign_keysassigning objects

之间存在差异

在ActiveRecord中,据我所知,你必须将一个整数传递给foreign_key字段。您可以将整数设置为您想要的任何值,如果您愿意,可以设置无效的

如果你传递一个ruby对象(I.E save group: @group),你基本上必须为Rails传递一个有效的对象来保存它

这就像我所知道的那样

答案 1 :(得分:0)

不 - 它不会自动在rails中进行任何验证,也不会添加任何数据库验证。

如果您需要,可以自行验证:

class Task < ActiveRecord::Base
  belongs_to :group
  validate :group_exists?

  def group_exists?
    !!self.group_id && Group.exists?(:id => self.group_id)
  end
end

有宝石可以帮助解决这个问题,你也可以使用validates_presence_of :group。有关更多讨论,请参阅此SO问题: validates_presence_of with belongs_to associations, the right way