0

我正在學習如何使用Ruby on Rails,並希望找到解決問題的最佳方法。我已經搜遍了很多論壇和Rails文檔,但尚未能夠理解解決方案,所以希望有人能夠幫助!Rails 5活動記錄協會

我的應用程序有3個控制器 - 用戶,user_addresses和發票。每個用戶可以有多個user_addresses,也可以有多個發票。我在我的發票表中添加了一個user_id列作爲我的user_addresses表的主鍵和一個user_id和address_id列作爲主鍵。

當我創建一個發票並選擇一個地址分配給它,然後保存它,我想不出如何填充user_id和address_id,我只能得到一個或另一個來保存。在我下面的例子中,我得到了user_id來保存,但不知道如何從地址中獲取user_id和id以保存到發票。

我用has_many:user_addresses和has_many:invoices設置了我的用戶模型。我的發票和用戶地址模型belongs_to:用戶。從我讀過的內容來看,我想我可能需要使用一個:擴展名,但我迷路了,不知道該怎麼做。任何幫助或指導將不勝感激!

發票表格

<div class="form-group"> 
    <%= label_tag(:user_id, "Customer") %> 
    <%= f.select(:user_id, @addresses.map {|a| [a.user.first_name + ' ' + a.user.last_name + ' - ' + a.street_1, a.user.id]},{}, {:class => 'form-control'}) %> 
    </div> 

    <div class="form-check"> 
    <label class="form-check-label"> 
    <%= f.check_box(:status, :class => 'form-check-input') %> 
    Status 
    </label> 
    </div> 

    <div class="form-group"> 
    <%= label_tag(:service_date, "Service Date") %> 
    <%= f.text_field(:service_date, 'data-provide' => 'datepicker', :class => 'form-control') %> 
    </div> 

    <div class="form-group"> 
    <%= label_tag(:service_type, "Service Type") %> 
    <%= f.select(:service_type, ["General Pest", "Weed Control", "Specialty Pest", "Rodent"],{}, {:class => 'form-control'}) %> 
    </div> 

    <div class="form-group"> 
    <%= label_tag(:service_charge, "Service Charge") %> 
    <%= f.text_field(:service_charge, :class => 'form-control') %> 
    </div> 

發票控制器

def new 
    @invoice = Invoice.new 
    @addresses = UserAddress.all 
    end 

表發票

create_table "invoices", force: :cascade, options: "ENGINE=InnoDB DEFAULT CHARSET=latin1" do |t| 
t.integer "user_id" 
t.integer "address_id" 
t.boolean "status",   default: false 
t.string "service_date" 
t.string "service_type" 
t.string "service_areas" 
t.string "service_materials" 
t.string "service_charge" 
t.string "service_info" 
t.datetime "created_at",      null: false 
t.datetime "updated_at",      null: false 
t.index ["address_id"], name: "index_invoices_on_address_id", using: :btree 
t.index ["user_id"], name: "index_invoices_on_user_id", using: :btree 

+0

「我只能得到一個或另一個保存」是什麼意思?即什麼程序導致哪些行爲(錯誤和/或輸出)的輸入?還請顯示所有相關的代碼和*閱讀[mcve] s *。 PS請參閱我在答案開始處添加的修改。 – philipxy

回答

1

我加了一個user_id列作爲我user_addresses表

聲明說PK說,用戶最多隻能有一個地址的主鍵。如果你想讓一個用戶能夠擁有多個地址,那麼你不需要這個PK。您可能希望每個用戶地址對都是UNIQUE/PK。

USER_ID和ADDRESS_ID列在我的發票表的主鍵

這意味着你不能有兩個發票爲同一人 - 地址對。這可能不是你想要的。通常,發票的唯一候選/主鍵是唯一的運行時發票ID。雖然很可能你想某種索引幫助優化查找基於人地址對的發票。

如果你聲明一些列作爲候選鍵(可能是PK),那麼你就是說它們是唯一的而不是NULL。但是你說你想要一張沒有用戶和地址的發票,這與此相矛盾。每個用戶有許多發票,但僅限於每個用戶有多個用戶地址對(每個都有一張發票)。聲明這樣一個有一張發票。而不是用戶所做的,因爲您必須保持UserInvoice與發票同步冗餘。 (但真的要發票ID)

答:通過管理冗餘。包括解決上述索引優化問題。

閱讀有關首先製作關係設計,然後通過Active Record設計表達它(以及所需的優化)的內容。

+0

感謝您的回覆。我可能沒有徹底解釋,但我確實希望所有發票都有一個user_id和address_id ...但由於用戶可以有多個地址,我不知道如何設置關係來自動填充基於數據庫的選擇。我將通過Active Record做更多關於關係設計的研究。我找到了一個解決方案,通過在設置爲地址標識的選擇字段選項上設置data-attr並使用jQuery來填充隱藏表單元素的值,以將地址標識提交給表單。 – StevenHolder

+0

我沒有說發票沒有關聯的user_id和address_id。我說你可能想要那些不構成發票的CK,你可能想要一個列的invoice_id。 – philipxy