我有以下型号:
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 :(得分: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)
假设您正确配置了关系,上述内容应该有效。