0

私はRuby on Railsでの作業方法を学習しており、私の問題を解決する最良の方法を探したいと思っています。私は多くのフォーラムやRailsのドキュメントを検索しましたが、まだ解決策を理解できていないので、誰かが助けてくれることを期待しています!Rails 5 Active Record Associations

私のアプリには3つのコントローラ、つまりuser_addressesと請求書があります。各ユーザは、複数のuser_addressを持つことができ、複数の請求書を持つこともできます。 user_id列をuser_addresses表の主キーとして、user_id列とaddress_id列を主キーとして請求書表に追加しました。

請求書を作成して割り当てるアドレスを選択して保存すると、user_idとaddress_idの両方を入力する方法がわかりません。どちらか一方しか保存できません。下の私の例では、user_idを保存するようになっていますが、user_idとidの両方を取得して請求書に保存するにはどうすればよいかわかりません。

has_many:user_addressesとhas_many:請求書を使用してユーザーモデルを設定しました。私のInvoiceとUserAddressモデルの両方がbelongs_to:userというモデルです。私が読んだことから、私は延長を利用する必要があるかもしれないと思うが、失われて何をすべきか分からない。どんな助けや指導も大歓迎です!

請求書フォーム

<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

私はPKは、ユーザーが最大1つのアドレスを持つことができると言うことを宣言私user_addressesテーブルの主キーとして

をuser_idの列を追加しました。ユーザーが複数のアドレスを持つことができるようにするには、そのPKは必要ありません。おそらく、各ユーザーアドレスのペアをUNIQUE/PKにする必要があります。

私の請求書テーブルの主キーとしてのuser_idとADDRESS_ID列

これは、あなたが同じ人アドレスのペアのための2つの請求書を持っていないことを意味します。それはおそらくあなたが望むものではありません。通常、インボイスの唯一の候補/主キーは、一意のランタイム請求書IDです。 のインデックスは、人と住所のペアに基づいて請求書の検索を最適化するのに役立ちます。

いくつかの列を候補キー(おそらくPK)として宣言すると、それらが一意でありNULLではないということになります。しかし、あなたは、それと矛盾するユーザーと住所の両方を持たずに請求書を希望していると言います。ユーザーごとに多くの請求書がありますが、ユーザーごとに多数のユーザーアドレスペア(請求書を含む)があるためです。そのようなのペアに請求書があることを宣言してください。 UserInvoiceをインボイスと同期して冗長に保つ必要があるため、ユーザーが行うことではありません。 (しかし実際には請求書IDが必要です)

A:スルーはその冗長性を管理します。上記のインデックス最適化に対処することを含みます。

まず、リレーショナルデザインを作成し、アクティブレコードデザインを使用して表現します(必要な最適化)。

+0

ありがとうございます。私は徹底的に説明していないかもしれませんが、私はすべての請求書にuser_idとaddress_idを持たせたいと思います...しかし、ユーザーは複数のアドレスを持つことができるので、選択肢に基づいてデータベースを自動的に設定する関係を設定する方法はわかりません。私はActive Recordを使ってリレーショナルデザインについてさらに研究します。私は、アドレスidに設定されたselectフィールドのオプションにdata-attrを設定し、フォームにアドレスidを送信する隠しフォーム要素の値を埋めるためにjQueryを使用することで解決策を見つけました。 – StevenHolder

+0

私は、請求書にuser_idとaddress_idが関連付けられていないとは言いませんでした。私はあなたがたぶんInvoicesのCKを形成しないようにしたいと思っていて、おそらくあなたがした列のinvoice_idがほしいと思っていました。 – philipxy

関連する問題