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

任何想法我做错了什么?

4

2 回答 2

2

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

在线:

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

您实际上是在调用变量+上的方法,因此这与调用a@user_country_posts是等效的。+nil

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

@user_country_posts = []
于 2012-10-29T23:35:55.050 回答
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)

假设您正确配置了关系,上述内容应该可以工作。

于 2012-10-29T23:51:32.813 回答