【问题标题】:Match and separate Rails serialized array匹配和分离 Rails 序列化数组
【发布时间】:2017-11-17 02:01:41
【问题描述】:

我有一个Company 模型如下:

class Company < ActiveRecord::Base
  has_many :employee_roles
  has_many :employees
  validates :company_name, uniqueness: true
  serialize :contractors, Array

end

现在我有一个页面,管理员可以在其中向公司添加/删除contractors。要添加 contractor,我只需将承包商 ID 存储在 contractors 中,如下所示:

def assign_contractors
  @company = Company.find(company_contractor_params[:company_id])
  @company.contractors << company_contractor_params[:contractor_id]
  @company.save
end

我现在想在一个页面上显示两个单独的列表。这样一个列表包含与company 关联的所有contractors,而另一个列表包含与该公司无关的所有contractors

def contractor_list
  @contractors = Contractor.where({ verified: true,
                        validated: true })
              .where('membership_type != ?', Contractor.membership_types["no_membership"])
  @company = Company.find(contractor_company_params[:company_id])

  @selected_contractors = @contractors.select { |c| @company.contractors.include? c.id }
  return render :status => 200, :json => {
    :contractors => @contractors,
    :selected_contractors => @selected_contractors
  }
end

但它给了我一个空列表,即使我所选公司的contractors 具有值["2", "1"],我通过Company.find(1).contractors 通过rails console 进行检查

如何从serialized 数据中获取选定承包商的列表?

【问题讨论】:

  • 我认为关键是["2", "1"],检查引号,它们是字符串,@company.contractors.include? c.id 永远不会是真的,因为c.id 是整数。试试c.id.to_s
  • @fanta 我也试过了,但没有运气,它仍然给我一个空列表
  • 你检查过@contractors 看看它包含哪些承包商?,也许它有不同的/

标签: ruby-on-rails arrays postgresql ruby-on-rails-4 serialization


【解决方案1】:

@fanta 是对的,问题是to_s,因为它被保存为字符串。我仍然不相信我写的查询,我最终改用了以下查询:

@selected_contractors = Contractor.find(@company.contractors) 

这将按照here 的建议将查询从 n 减少到 1

【讨论】:

    猜你喜欢
    • 2011-07-06
    • 2015-07-06
    • 2019-01-20
    • 2018-11-15
    • 1970-01-01
    • 2016-05-08
    • 2013-10-11
    • 1970-01-01
    • 2011-11-10
    相关资源
    最近更新 更多