考虑两个表表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之间的连接。 我有一些疑问:
- 这是一个外键约束?我在网上找不到任何说明has_many属性创建外键的材料,尽管迁移文件暗示了这一点。
- 在创建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仍然为空。
你的TableA和TableB有多对多的关系。您还需要定义一个中间表来管理它们之间的多对多关系。 –
@SachinR,这是强制性要求吗?我的意思是,不能通过has_many属性相关的两个表在没有中间表的情况下工作吗? – AarCee