外键未正确设置(变为空)

时间:2015-04-30 11:57:25

标签: ruby-on-rails foreign-keys foreign-key-relationship ruby-on-rails-4.2

考虑两个表TableA和TableB:

class TableA
    has_many: TableBs
end

class TableB
    has_many: TableAs
end

在TableB的控制器中:

class TableBController < ApplicationController
    def new
        @tableB = TableB.new
    end

    def create
        @tableB = TableB.new(tableB_params)
        @tableB.save
    end

    def tableB_params
        params.require(:tableB).permit(:tableAId, :date, :time)
    end
end

上面的tableAId是TableB和TableA之间的连接。 我有些疑惑:

  1. 这是外键约束吗?我在网上找不到任何说明has_many属性创建外键的材料,尽管迁移文件是这样建议的。
  2. 在创建TableB的实例时,我不知道为什么tableAId的值被设置为null。此创建是通过app \ views \ tableBs中new.html.erb中的form_for构造完成的。日期和时间值设置正确。我在new.html.erb文件中使用了tableAId,date和time列中的相同方法。我正在rails控制台中查看这些值。数据库是sqlite3。
  3. 提前致谢。

    附录: 迁移似乎设置正确:

    class AddTableAToTableB < ActiveRecord::Migration
      def change
        add_reference :tableBs, :tableA, index: true
        add_foreign_key :tableBs, :tableAs
      end
    end
    

    [编辑] 根据@ ilan berci在下面的回答,我像这样编辑了TableB:

    class TableB
        has_many: TableAs
        accepts_nested_attributes_for    :tableAs
    end
    

    仍然是TableB:tableAId属性设置为null。为了完整起见,我还包括相关的表单字段,从下拉列表中选择TableA中的名称:

    <%= f.label :tableA_id %>
    <%= f.collection_select :tableA_id, TableA.all, :id,
                                :name, :include_blank => true %>
    

    因此,从上面的下拉列表中,我正确地看到了TableA的实例列表,但在提交表单时,tableA_id仍为null。

1 个答案:

答案 0 :(得分:0)

  

1)这是外键约束吗?我找不到任何材料   在线说,has_many属性创建一个外键,   虽然迁移文件表明了这一点。

不,这不是外键约束。这是一个ActiveRecord构造,它为您创建了很多辅助方法来导航关系。如果要添加外键,则必须在迁移文件中自行完成

  

2)在创建TableB的实例时,我不知道为什么会有这个值   tableAId设置为null。这个创建是通过form_for完成的   在app \ views \ tableBs中的new.html.erb中构造。日期和时间   值设置正确。我在使用相同的方法   tableAId,date和time列的new.html.erb文件。我正在观看   rails控制台中的这些值。数据库是sqlite3。

如果您希望使用嵌套表单,则必须添加&#34; accepts_nested_attributes_for&#34;在您的模型中,按照http://api.rubyonrails.org/classes/ActiveRecord/NestedAttributes/ClassMethods.html上的说明操作 此方法添加了更多简化嵌套资源创建和更新的方法。