确保数组中至少有一个项存在于另一个项中

时间:2012-10-29 18:03:34

标签: ruby-on-rails ruby-on-rails-3 activerecord associations

我有以下型号:

class Post < ActiveRecord::Base
    has_and_belongs_to_many :countries
end

class User < ActiveRecord::Base 
    has_many :entitlements
    has_many :countries, :through => :entitlements
end

帖子索引页面上的帖子必须至少有一个与用户所在国家/地区相同的国家/地区。

我在我的模型中尝试了各种范围和冗长的控制器代码,但我无法弄清楚如何检查什么应该是一个简单的关系:在Post.countries中是否存在至少一个项目在User.countries中。

任何帮助都很受欢迎。

更新:

好的,所以我的控制器中有以下内容:

  def index
    @user = current_user
    @user.countries.each do |user_country|  
       @user_country_posts += Country.find(user_country.id).posts
    end
    @posts = @user_country_posts
  end

正在迭代user.countries并查找这些国家/地区的每个帖子。但是当我运行它时,我得到了:

NoMethodError: undefined method `+' for nil:NilClass

任何想法我做错了什么?

2 个答案:

答案 0 :(得分:2)

问题在于您尝试使用之前未定义的@user_country_posts实例变量,因此其值为nil

在这一行:

@user_country_posts += Country.find(user_country.id).posts

您实际上是在+变量上调用@user_country_posts方法,因此在+上调用nil就等效了。

尝试在方法的开头初始化变量,例如:

@user_country_posts = []

答案 1 :(得分:0)

我还会考虑使用ruby的联合方法: 即:

[1,2,4] & [1,4,5]
=> [1,4]

因此,如果您有用户国家/地区列表和发布国家/地区列表,那么以下内容可能会有效: 即:

@shared_country_ids = @user.countries.map(&:id) & @post.countries(&:id)

从您上面的更新中,您想要做的就是显示所有包含用户国家/地区代码的帖子。如果是这种情况,我会做以下事情: 即:

@posts = Post.where(:countries => @user.countries)

假设您正确配置了关系,上述内容应该有效。