通过一组对象rails过滤对象

时间:2017-09-16 12:47:22

标签: ruby-on-rails

我有@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))

2 个答案:

答案 0 :(得分:0)

问题在于,如果您有一个选定的帖子与已发布的帖子同名,而另一个选择的帖子与相同的已发布帖子具有相同的信息,则将根据两个不同的选定帖子选择发布的帖子。我不确定你想要的是什么。

最好是使用主键进行连接。

使用name而不是主键在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")

答案 1 :(得分: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)