2012-10-29 30 views
1

我有以下型号:确保阵列中的至少一个项目存在于另一个

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 

任何想法我做错了什么?

+0

我不明白..只显示帖子,至少有1个国家? – Lichtamberg

回答

2

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

在生产线:

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

你实际上是在呼吁@user_country_posts变量,这相当于因此与上nil调用++方法。

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

@user_country_posts = [] 
+0

这工作得很好。谢谢。 –

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) 

上述应工作假设你正确配置的关系。

+0

不幸的是,这不起作用,因为Post和Countries之间的关系是通过由于HABTM关系而生成的连接表(countries_posts)完成的。此外,您的最后一条命令是否显示所有*国家与用户国家匹配的帖子? –

相关问题