在ActiveRecord / Rails中查询或迭代连接表

时间:2015-02-24 00:29:05

标签: ruby-on-rails activerecord

我有两张桌子:

Venues 
has_many :venue_intel_maps

VenueIntelMap 
belongs_to :venue

venue_intel_map 表中,有一个名为:tag_label 的列,我想抓住每个具有venue_intel_map

的特定场地

在我的控制器下面,这将返回每个场地的数组,然后每个场地都有一个 venue_id

 def show
    @venues = Venue.where(parent_venue_id: current_admin.parent_venue_id)
 end

所以在我看来,我可以针对特定的场地这样做。

- @venues.each do |venue|
  =venue.name
  =venue.address
  =venue.location

但是因为我想访问venue_intel_maps表,所以我可以调用一个名为:tag_label 的列,我想避免嵌套每个可能看起来像这样的语句

- @venues.each do |venues|
    - venues.venue_intel_maps.each do |intel_maps|
          = intel_maps.tag_label 

无论如何我可以清理这个或任何建议吗?我试图在活动记录中使用.joins或.selects,但不知道如何成功地这样做,所以我可以以某种方式将逻辑放在我的Venues模型中。

修改

以某种方式在控制器中定义我的场地这样做会更好吗?在视图中,我将从我的venue_intel_maps表中提取内容,这会有什么好处吗?

@venues = Venue.joins(:venue_intel_maps).where(parent_venue_id: current_admin.parent_venue_id)

2 个答案:

答案 0 :(得分:0)

取决于您的Rails版本,请尝试:

@venues.venue_intel_maps.pluck(:tag_label)

@venues.venue_intel_maps.map(&:tag_label) 

请参阅:http://rubyinrails.com/2014/06/rails-pluck-vs-select-map-collect/

答案 1 :(得分:0)

您可以预加载(Rails 3+)控制器中的venue_intel_maps

 def show
   @venues = Venue.where(
     parent_venue_id: current_admin.parent_venue_id
   ).preload(:venue_intel_maps)
 end

然后在视图中,使用您建议的迭代

- @venues.each do |venue|
  = venue.name
  = venue.address
  = venue.location
  = venue.venue_intel_maps.each do |intel_maps|
    = intel_maps.tag_label