2017-09-16 24 views
1

私は@selected_postsを持っています - selected_postの配列です。 各selected_postには名前と情報があります。オブジェクトをオブジェクトの配列でフィルタリングする

そして、私は別のActiveRecordのモデル

PublishedPost < ActiveRecord::Base 
end 

を持っていると私は

published_post.name == selected_post.name and published_post.info== selected_post.info 

がどのように私はこれを行うのです公開されたすべての記事を選択する必要がありますか?

私のようなものを考える:

PublishedPost.where("name in ? AND info in ?", @selected_posts.map(&:name) @selected_posts.map(&:info)) 
+0

最初に別のクラスとして 'PublishedPost'が本当にありますか?投稿テーブルで[enum column](http://api.rubyonrails.org/v5.1/classes/ActiveRecord/Enum.html)を使用するだけで、あなたがやっていることを実行することができます。 'enum status:[:draft、:published、:trashed]' – max

+0

はい、データベース構造が既に定義されていて、私によって書かれていないので、 'PublishedPost'を別のテーブルとして持つべきです。 – user2950593

答えて

0

あなたが出版され、ポストと同じ名前を持つ一つの選択されたポストを持ち、同じように同じ情報を持つ異なる選択されたポストが出版されている場合ということがあるトラブル投稿された投稿は、2つの異なる選択された投稿に基づいて選択されます。私はそれがあなたが望むものであるかどうかはわかりません。

プライマリキーを使用して結合しない方がよいでしょう。

には、主キーの代わりに名前を使用してPublishedPostクラスで定義された結合があります。

class PublishedPost 

    belongs_to :selected_post, foreign_key: 'name', primary_key: 'name', optional: true 

end 

今、あなたが行うことができます...

@published_posts = PublishPost.join(:selected_post).where(selected_posts: @selected_posts).where("selected_posts.info = published_posts.info") 
0

まず、単一のループでnameinfoを集める:あなたはすでに以下のように考えているよう

all_names, all_info = Array.new, Array.new 
@selected_posts.each do |sp| 
    all_names << sp.name 
    all_info << sp.info 
end 

次にクエリでそれを使用します:

PublishedPost.where(name: all_names, info: all_info) 
関連する問題