【问题标题】:Ensuring at least one item in an array exists in another确保数组中的至少一项存在于另一项中
【发布时间】:2012-10-29 18:03:33
【问题描述】:

我有以下型号:

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

任何想法我做错了什么?

【问题讨论】:

  • 我不明白.. 只显示至少有 1 个国家/地区的帖子?

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


【解决方案1】:

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

在线:

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

您实际上是在@user_country_posts 变量上调用+ 方法,因此这相当于在nil 上调用+

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

@user_country_posts = []

【讨论】:

    【解决方案2】:

    我也会考虑使用 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)
    

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

    【讨论】:

    • 不幸的是,这不起作用,因为 Post 和 Country 之间的关系是通过 HABTM 关系生成的连接表 (countries_posts) 完成的。此外,您在 所有 个国家/地区与用户的国家/地区匹配的显示帖子上的最后一条命令不是吗?
    猜你喜欢
    • 2015-03-03
    • 1970-01-01
    • 1970-01-01
    • 2020-10-19
    • 2023-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-27
    相关资源
    最近更新 更多