0

考虑两个表表A和表B:外键没有得到正确设置(即将为空)

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是表B和表A之间的连接。 我有一些疑问:

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

在此先感谢。

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

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

[编辑] 按以下@ilan berci的回答,我编辑表B像这样:

class TableB 
    has_many: TableAs 
    accepts_nested_attributes_for :tableAs 
end 

还是表B的:tableAId属性设置为null。为了完整起见,我还包括从表A从下拉选择一个名字相关的表单域,但在提交表单

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

所以从上面的下拉菜单中,我看到正确表A的实例的列表, tableA_id仍然为空。

+0

你的TableA和TableB有多对多的关系。您还需要定义一个中间表来管理它们之间的多对多关系。 –

+0

@SachinR,这是强制性要求吗?我的意思是,不能通过has_many属性相关的两个表在没有中间表的情况下工作吗? – AarCee

回答

0

1)这是外键约束吗?我在网上找不到任何材料 ,其中说has_many属性创建一个外键, ,虽然迁移文件建议如此。

不,这不是外键约束。这是一个ActiveRecord结构,它为您创建了很多帮助方法来导航关系。如果你想添加外键,你必须自己做,在迁移文件

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

如果你希望在你的模型中使用嵌套的表格,那么你必须添加“accepts_nested_attributes_for”,并按照http://api.rubyonrails.org/classes/ActiveRecord/NestedAttributes/ClassMethods.html 这种方法的说明补充说,简化创建和嵌套资源的更新的详细方法。

+0

上面的链接是信息性的,但请参阅编辑我的问题,因为它没有工作。 – AarCee

相关问题