0

Я учусь работать с Ruby on Rails и хочу найти лучший способ решить мою проблему. Я просмотрел многие форумы и документацию Rails, но пока не смог понять решение, поэтому надеюсь, что кто-то сможет помочь!Rails 5 Active Record Association

В моем приложении есть 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: счета-фактуры. и моя модель счета-фактуры и UserAddress принадлежит_ пользователю:. Из того, что я прочитал, я думаю, мне, возможно, придется использовать расширение: через расширение, но я потерян и не уверен, что делать. Любая помощь или руководство будут очень благодарны!

счетов-фактур форма

<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 говорит о том, что пользователь может иметь более одного адреса. Если вы хотите, чтобы пользователь мог иметь несколько адресов, вам не нужен этот ПК. Вероятно, вы хотите, чтобы каждая пара адресов пользователей была UNIQUE/PK.

user_id и address_id столбец в качестве первичных ключей в моей таблице счетов-фактур

Это означает, что вы не можете иметь два счета за тот же человек-адрес пары. Это, вероятно, не то, что вы хотите. Как правило, единственным кандидатом/первичным ключом для счетов-фактур является уникальный идентификатор счета времени выполнения. Хотя вполне вероятно, что вы хотите получить какой-то индекс, чтобы оптимизировать поиск счетов-фактур на основе пар личных адресов.

Если вы объявляете некоторые столбцы в качестве ключа кандидата (возможно, PK), вы говорите, что они уникальны, а не NULL. Но тогда вы говорите, что хотите сделать счет, не имея как пользователя, так и адреса, что противоречит этому. Существует много счетов-фактур для каждого пользователя, но только потому, что для каждого пользователя существует множество пар адресов пользователей (каждый из которых имеет счет-фактуру). Заявите, что такая пара имеет счет-фактуру. И не то, что пользователь делает, потому что вам придется сохранять UserInvoice избыточно в синхронизации с Invoice. (Но на самом деле вам нужны идентификаторы счетов.)

A: через управляет этой избыточностью.Включая решение упомянутой выше оптимизации индексирования.

Читайте о том, чтобы сначала создать реляционный дизайн, а затем выразить его (и желаемую оптимизацию) с помощью схемы Active Record.

+0

Благодарим за отзыв. Возможно, я не объяснил подробно, но я хочу, чтобы все счета-фактуры имели user_id и address_id ... Но поскольку пользователи могут иметь несколько адресов, я не могу понять, как настроить отношение для автоматического заполнения базы данных на основе выбора. Я сделаю еще несколько исследований относительно реляционного дизайна через Active Record. Я нашел решение, установив параметр data-attr для опций поля выбора, заданных для идентификатора адреса, и использования jQuery для заполнения значения скрытого элемента формы для отправки идентификатора адреса в форму. – StevenHolder

+0

Я не сказал, что счет-фактура не будет связан с user_id и address_id. Я сказал, что вы, вероятно, хотели, чтобы те, кто не создавал CK счетов-фактур, вы, вероятно, захотели сделать колонку invoice_id. – philipxy

Смежные вопросы