2016-06-22 8 views
1

I以下のRuby on Railsは実体があります。レール:関連するオブジェクトのいずれかの条件に一致するすべてのレコードを検索

プレイリスト:

class Playlist < ActiveRecord::Base { 
          :id => :integer, 
          :name => :string, 
        :created_at => :datetime, 
        :updated_at => :datetime, 
         :dimension => :string, 
          :title => :string, 
          :text => :string, 
          :price => :float, 
     :playlist_image_file_name => :string, 
    :playlist_image_content_type => :string, 
     :playlist_image_file_size => :integer, 
     :playlist_image_updated_at => :datetime, 
          :main => :boolean, 
         :action => :string, 
       :hairdresser_id => :integer 
} 

とキーワード:

class Keyword < ActiveRecord::Base { 
      :id => :integer, 
      :name => :string, 
    :created_at => :datetime, 
    :updated_at => :datetime, 
    :preselected => :boolean 
} 

関係を基本的にPlaylistオブジェクトには0以上のキーワードが関連付けられています。

Playlist.first.keywords 

と最初のプレイリストに関連付けられたすべてのキーワードを検索:私はそのような何かを行うことができます

class Keyword < ActiveRecord::Base 
    has_and_belongs_to_many :playlists 
end 

class Playlist < ActiveRecord::Base 
    has_and_belongs_to_many :keywords 

    has_attached_file :playlist_image, styles: {medium: "500x500", small: "200x200", thumb: "40x40"}, default_url: "/system/playlist_default.jpg" 
    validates_attachment_content_type :playlist_image, content_type: /\Aimage\/.*\Z/ 
end 

: ものがモデルです。

ここでは、キーワードとして特定の単語を持つすべてのプレイリストを返し、 "main"がtrueに等しい関数を作成したいと考えています。 たとえば、キーワード「Summer」を持つすべてのプレイリスト。 私はそれをしようと試み:

Playlist.where(:main => true).map{|x| x.keywords.include? "Summer"} 

しかし、それはキーワードを、関連プレイリストに含まれている場合はtrueかによって、偽のみを含む配列を返すか「夏」、私は場合にのみ、全体のプレイリストを返す何かを探していますそのプレイリストのキーワードの配列には「夏」という単語が含まれています。それをどうすれば実現できますか?

Playlist.includes(:keywords) 
     .where(playlists: {main: true}, keywords: {name: 'Summer'}) 
+0

あなたが行うことができます 'Playlist.where:

class Playlist < ActiveRecord::Base has_and_belongs_to_many :keywords scope :main, -> { where(main: true) } scope :with_key_words, -> (key_words) { joins(:keywords).where(keywords: {name: key_words}) } end 

は、すべてのプレイリストだけで、あなたの要件を満たす取得するには(:メイン=>真).select {| X | x.keywords.include? "Summer"} 'を' map'ではなく 'select'で置き換えます。ただし、より効率的であるため、代わりにクエリ(例:potashinの回答)を使用する必要があります。 – chrismanderson

答えて

2

何かがincludesを使用して、動作するはずです。

Playlist.main.with_key_words(['Summer']) 
0

あなたは再利用性を高めるためにスコープを作成する必要があります。このような

関連する問題