2017-09-16 69 views
1

我有@selected_posts - selected_post对象的数组。 每个selected_post有名称和信息。通过一组对象过滤对象rails

而且我还有一个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'作为一个独立的课程?只需在posts表上使用[enum column](http://api.rubyonrails.org/v5.1/classes/ActiveRecord/Enum.html)即可完成您的工作。 'enum status:[:draft,:published,:trashed]' – max

+0

是的,我应该把'PublishedPost'作为单独的表格,因为数据库结构已经被定义并且不是由我写的 – user2950593

回答

0

麻烦的存在,如果你有一个选择的职位具有相同的名称作为已发布职位和不同的选择后用相同的信息一样公布发布后,发布的帖子将根据两个不同的选定帖子进行选择。我不确定那是你想要的。

更好的做法是使用主键进行连接。

在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)