多对多的关联和搜索

时间:2016-02-29 16:39:29

标签: ruby-on-rails

我有3个模型:Event Lineup Artist

class Event < ActiveRecord::Base
  has_many :lineups
  has_many :artists, through: :lineups
end

class Lineup < ActiveRecord::Base
  belongs_to :event
  belongs_to :artist
end

class Artist < ActiveRecord::Base
  has_many :events, through: :lineups
  has_many :lineups
end

艺术家有name属性。

编辑:我的问题不够准确。

如何找到所有活动,例如,这三位艺术家的名字: artist1artist2artist3

有了这些事件:

event1.artists.pluck(:name)
=> ['artist1', 'artist2', 'artist3']

event2.artists.pluck(:name)
=> ['artist1', 'artist2', 'artist3', 'artist4']

event3.artists.pluck(:name)
=> ['artist1', 'artist2', 'artist4']

event4.artists.pluck(:name)
=> ['artist1', 'artist2']

结果应为event1event2

3 个答案:

答案 0 :(得分:3)

您将使用joins之类的:

Event
  .joins(:artists)
  .where( artists: { name: ['artist1', 'artist2', 'artist3'] } )

答案 1 :(得分:0)

假设您的模型持有@event = Event.artists.all

进入您的视图并使用此

<% @event.each do |x| %>
   <%= x.name %>
<% end %>

这将打印出每个艺术家的所有名字。

如果你特别要求artist1,artist2,artist3 ......请使用此

@event.where(name: 'artist name goes here')

答案 2 :(得分:0)

我设法根据Arup的答案做到了这一点。

lineup = ['artist', 'artist2', 'artist3']
Event.joins(:artists)
     .where(artists: { name: lineup})
     .group("events.id")
     .having("count(events.id) = ?", lineup.length)