2013-04-28 93 views
1

我是一个n00b,仍然挣扎着加入。如何在rails中通过和belongs_to关联执行has_many的连接表?

我有两种模式:患者和提供者通过表格图表连接。

我使用关联“has_many:through”而不是“has_and_belongs_to_many”,因为我需要将另一列添加到Chart表[称为patient_mrn],我无法对“has_and_belongs_to_many”场景进行操作。

什么即时试图做的是出现在特定的病人及其所有相关供应商[各有其特定的patient_mrn]

病人模型有:

has_many :charts 
has_many :providers, :through => :charts 

提供者模型有:

的has_many:图表 的has_many:患者:通过=>:图表

和图表模型具有:

belongs_to :patient 
belongs_to :provider 

然后在我的节目中病人控制器动作,我有:

@patient = Patient.find(params[:id]) 
@providers = Provider.joins(:charts)where(:charts => { :patient_id => @patient.id}) 

在我的患者视图我有:

<h1>Listing providers</h1> 

<table> 
    <tr> 
    <th>Provider name</th> 
    <th>Patient_mrn</th> 
    </tr> 

<% @providers.each do |provider| %> 
    <tr> 
    <td><%= provider.name %></td> 
    <td><%= provider.chart.patient_mrn %></td> 
    </tr> 
<% end %> 
</table> 

我同时实现控制器动作和视图写错了,但无法弄清楚如何解决它们。

回答

1

这应该工作:

provider_ids = @patient.charts.select(:provider_id).map(&:provider_id) 
@providers = Provider.includes(:charts).find provider_ids 

在你所有的病人图表的供应商的第一道防线。该映射是必需的,因为select不返回一个整数数组,而是只有一个成员的结构数组provider_id。

在第二行中,您只需选择相应的提供程序并包含图表,以便不必处理N + 1个查询(请参阅http://guides.rubyonrails.org/active_record_querying.html#eager-loading-associations)。

我看不出你的观点有什么问题,但我可能是错的。

+0

感谢Daniel-我感谢您的帮助!我需要真的打这些书。 – user2284821 2013-04-29 04:11:16

相关问题