我想使用其他模型中的外键填充模型(使用选择框)

时间:2015-04-15 18:18:36

标签: ruby-on-rails ruby ruby-on-rails-4

我想创建一个恰好是模型的估算表单。这个表格有 客户信息也是一个模型,车辆信息是另一个嵌套在客户资源上的模型。员工姓名(也是模型)。我希望能够在客户上选择使用选择框,这会将我引导至客户车辆列表,然后能够从模型员工列表中填充谁是执行估算的员工。 (我正在学习ROR,所以请向我道歉可能没有正确的术语来解释:我也能够为客户生成选择框但是不能超过它。换句话说没有甚至能够在一个小型箱上为每个顾客提供车辆。请帮助。

型号:

class Estimate < ActiveRecord::Base
    belongs_to :customer
    belongs_to :vehicle
    belongs_to  :employee
    has_many :lines_in_estimates
end

class Customer < ActiveRecord::Base
    has_many :vehicles
    has_many :estimates
    validates :first_name, presence: true
    validates :last_name, presence: true
    validates :h_phone, presence: true
    validates :c_phone, presence: true
    validates_format_of :email, with: /\A[\w]([^@\s,;]+)@(([\w-]+\.)+          (com|edu|org|net|gov|mil|biz|info))\z/i

   def first_name_and_last_name
    "#{first_name} #{last_name}"
  end
 end

class Vehicle < ActiveRecord::Base
    belongs_to :customer
end

class Employee < ActiveRecord::Base
end

控制器:

    class EstimatesController < ApplicationController
    before_action :set_estimate, only: [:show, :edit, :update, :destroy]
    before_action :set_customer, only: [:show, :edit, :update, :destroy]


    def index
        @estimates = Estimate.all
    end

    def show
    end

    def new
        @estimate = Estimate.new
    end




    private

        def set_estimate 
             @estimate = Estimate.find(params[:id])
        end

        def set_customer
            @estimate = Estimate.find(params[:id])
        end

        def set_vehicle
            @vehicle = @customer.vehicles.find(params[:id])
        end

        def estimate_params
            params.require(:estimate).permit(:statetax, :muntax, :subtotal,     :total, :created_at, :updated_at, 
                                        :customer_id, :vehicle_id,     :employee_id)
    end

        def customer_params
            params.require(:customer).permit(:first_name, :last_name, :addr1,     :addr2, :city, :state, :zip, :h_phone, :c_phone, :email)
    end
end

形式:

    <%= form_for(@estimate) do |f| %>

    <% if @estimate.errors.any? %>
      <div id="error_explanation">
      <h2><%= pluralize(@estimate.errors.count, "error") %> prohibited this     employee from being saved:</h2>

      <ul>
      <% @estimate.errors.full_messages.each do |message| %>
        <li><%= message %></li>
      <% end %>
      </ul>
    </div>
  <% end %>




  <div class="field">
    <%= f.label :Choose_Customer %><br> 
    <%= collection_select(:estimate, :customer_id, Customer.all, :id,        :first_name_and_last_name, prompt: true ) %>
  </div>


  <div class="actions">
    <%= f.submit %>
  </div>
<% end %>

1 个答案:

答案 0 :(得分:0)

如果我正确理解您的使用案例,客户有很多车辆,车辆有很多估计。通过正确设置Rails模型,您可以调用customer.vehicles来返回该客户拥有的一系列车辆。通过迭代,您可以调用vehicle.estimates来获取每辆车的估算数组。

class Customer << ActiveRecord::Base
    has_many :vehicles
end

class Vehicle << ActiveRecord::Base
    belongs_to :customer
    has_many :estimates
end

class Estimate << ActiveRecord::Base
    belongs_to :vehicle
end

在针对车辆和估算的create_table迁移中,您需要分别t.belongs_to :customert.belongs_to :vehicle,以便在您的数据库中创建允许Rails建立连接的外键。

使用has_many时以及命名表时使用复数名称。

设置并运行后,为了获得客户的所有估算值,我认为您需要做的就是将has_many :estimates, through :vehicles添加到客户模型中。这将使customer.estimates能够返回所有估算值。我不太确定我的理由,所以先让其他人先工作。

对此here进行了一些阅读。