Rails如何在视图中访问不同的DB表

时间:2018-02-14 01:11:37

标签: ruby-on-rails ruby

我是Ruby和RubyOnRails的新手。到目前为止,我一直在关注一个基本的Rails教程,并创建了几个视图和控制器,以便能够在我的MySQL数据库上执行基本的CRUD,每个都特定于数据库中的表。

我开始了一个新视图,我希望能够从两个单独的表中显示信息。我希望能够获取合同的客户名称。我觉得这是一个简单而常见的解决方案,我到底能看到什么?

合同视图

 <table>
    <tr>
    <th>Contract ID</th>
    <th>Customer ID</th>
    <th>Discount</th>
    <th>Start Date</th>
    <th>End Date</th>
    <th>Payment Terms</th>
    <th>Delivery Day Of Week</th>
    <th>Employee ID</th>
    <th>Note</th>
    <th>Commission</th>
    <th>Active</th>

    </tr>

    <% @contracts.each do |contract| %>
    <tr>
    <td><%= contract.ContractID %></td>
    <td><%= contract.CustomerID %></td>
    <td><%= contract.fields_for :customer do |w| %>
    <%= w.text_field :CustomerName %>
    <% end %>
    </td>
    <td><%= contract.Discount %></td>
    <td><%= contract.StartDate %></td>
    <td><%= contract.EndDate %></td>
    <td><%= contract.PaymentTerms %></td>
    <td><%= contract.DeliveryDayOfWeek %></td>
    <td><%= contract.EmployeeID %></td>
    <td><%= contract.Note %></td>
    <td><%= contract.Commission %></td>
    <td><%= contract.Active %></td>


    </tr>
    <% end %>
    </table>

合同模型

> class Contract < ApplicationRecord belongs_to :customer
> 
> accepts_nested_attributes_for :customer
> #Validation
>   
> 
> #Mapping this object to the Database tables self.table_name = "contract" self.primary_key = "ContractID" end

客户模式

> class Customer < ApplicationRecord
> 
> has_many :contracts
> 
> #Validation validates :CustomerID, :CustomerTypeID, presence: true
> 
> validates :CustomerID, uniqueness: true
> 
> #Mapping this object to the Database tables self.table_name = "customer" self.primary_key = "CustomerID"
> 
> end

合同控制器

class ContractsController < ApplicationController
  def index
    @contracts = Contract.all
    @customers = Customer.all
  end
end

1 个答案:

答案 0 :(得分:3)

由于您已经定义了客户可能有很多合同,因此您现在需要定义该合同属于客户,因此,修改您的模型应该是这样的:

class Contract < ApplicationRecord
  belongs_to :customer
  ...
end

class Customer < ApplicationRecord
  has_many :contracts
  ...
end

现在,您可以从特定合同中访问客户名称属性,例如:

<% @contracts.each do |contract| %>
  <%= contract.customer.name %>
<% end %>

这应该可以获取客户名称,但是为了改进该查询,您可以在索引操作上添加一个包含:

def index
  @contracts = Contract.includes(:customer).all
  ...
end