考虑两个表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之间的连接。 我有些疑惑:
提前致谢。
附录: 迁移似乎设置正确:
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。
答案 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上的说明操作 此方法添加了更多简化嵌套资源创建和更新的方法。