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

相關問題