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