【问题标题】:Does rails association prevents a new record to be created like a foreign_key on a SQL create table would?Rails 关联是否会阻止像 SQL 创建表上的 foreign_key 那样创建新记录?
【发布时间】:2014-05-08 08:02:46
【问题描述】:

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

如果我有:

class Task < ActiveRecord::Base
    belongs_to :group
end

class Group < ActiveRecord::Base
    has_many :tasks
end

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

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

【问题讨论】:

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


    【解决方案1】:

    不 - 它不会自动在 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
    

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

    【讨论】:

      【解决方案2】:

      不,不会 - 设置 foreign_keysassigning objects 之间存在差异

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

      如果你传递一个 ruby​​ 对象(即保存group: @group),你基本上必须传递一个有效的对象让 Rails 保存它

      我知道的就这么多

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多