【问题标题】:Extracting uniq results in ruby提取 uniq 结果为 ruby
【发布时间】:2020-07-19 22:06:54
【问题描述】:

我有 users1 和 users2,我想做的是将它们结合起来,并在没有用户重复的情况下获得用户的 uniq 结果。但是我无法这样做,因为我收到 NoMethodError (undefined method `+' for nil:NilClass): error。我怎样才能解决这个问题。请帮我解决这个问题。

def wanted_users
  @users1 = License.find(params[:ID]).users
  driving_facilities = License.find(params[:ID]).facilities.ids
  user_ids = FacilitiesUser.where(facility_id:  driving_facilities).pluck(:user_id)
  @users2 = User.where(id: [user_ids])
  @users = @users1 + @users2
  @users.uniq
end

用户.rb

has_many :facilities_users, dependent: :destroy
has_and_belongs_to_many :facilities, join_table: :facilities_users

facility.rb

has_and_belongs_to_many :users

facilities_user.rb

belongs_to :user
belongs_to :facility

schema.rb

create_table "facilities_users", force: :cascade do |t|
    t.bigint "user_id", null: false
    t.bigint "facility_id", null: false
    t.index ["facility_id"]
    t.index ["user_id", "facility_id"], unique: true
end

【问题讨论】:

  • "我收到 NilClass 错误。' -- 错误是什么?请edit your post 包含它。错误应该显示哪一行代码包含问题。如果我们自己没有看到这一点,这会使问题变得不必要地神秘。
  • @TomLord 对此感到抱歉。我在问题中添加了错误消息
  • 这是一个巨大的X&Y problem。当您真正应该首先询问我们如何不从数据库中获取重复项以及如何在不执行诸如 6 个数据库查询之类的操作的情况下执行相对简单的工作时,您正在询问如何在 Ruby 中删除重复项。
  • 如果您编辑问题以显示您的模型、数据和预期结果,我们可以向您展示如何实际创建有效解决问题的查询或关联。
  • 你今天不是问了一个非常相似的问题吗,我解释说 HABTM 不使用连接模型?也许您应该从阅读我的答案中链接的关联指南和查询界面开始。这里的答案就像那个问题has_many through:

标签: ruby-on-rails ruby postgresql ruby-on-rails-5


【解决方案1】:

这就是我解决问题的方法。 user_ids 不是唯一的,所以我将它们设为唯一,然后我提取了解决我的问题的用户。

def wanted_users
  license = License.find(params[:ID])
  @users1 = license.users
  driving_facilities = license.facilities.ids
  user_ids = FacilitiesUser.where(facility_id:  driving_facilities).pluck(:user_id).uniq
  @users2 = User.where(id: [user_ids])
  @users = @users1 + @users2
  @users = @users.uniq
end

【讨论】:

  • 原来的错误出现@users1nil,你不能给nil加点东西。 (未定义的方法+ 用于 NilClass)。我不能确定这一点,因为您仍然没有发布完整的错误消息。您的新代码仍然包含完全相同的逻辑:License.find(params[:ID]).users + ... - 所以我看不出这是如何解决问题的。您似乎所做的只是定义了一个变量以减少重复行。这是一种改进,但不是答案。
  • 此外,在 one 数据库查询中肯定会有一种更加优雅/高效的方式来执行此操作,而无需在 ruby​​ 中执行任何uniq 逻辑。但由于您没有分享 Lincense 是什么,我无法确定如何做到这一点。
【解决方案2】:

您应该避免使用array = arrayA + arrayB,因为它会引发您上述问题的错误。

使用运算符push<< 而不是+

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-12-01
    • 1970-01-01
    • 2016-02-28
    • 2011-09-26
    • 1970-01-01
    • 1970-01-01
    • 2015-02-15
    相关资源
    最近更新 更多