我是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
答案 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