【问题标题】:Rails 5 Return all records and include necessary associationRails 5 返回所有记录并包括必要的关联
【发布时间】:2016-12-09 08:40:22
【问题描述】:

所以我们有这样的案例(多对多通过):

  class Company < ActiveRecord::Base
    has_many :contracts
    has_many :subscribers, through: :contracts
  end

  class Contract < ActiveRecord::Base
    belongs_to :company
    belongs_to :subscriber
  end

  class Subscriber < ActiveRecord::Base
    has_many :contracts
    has_many :companies, through: :contracts
  end

请帮助我们通过subscriber_id返回所有公司及其合同

更多细节例如 =>

我们有subscriber_id

所以现在我们可以找到需要关联的公司

Company.includes(:contracts).where(contracts: {subscriber_id: params[:id]})

但它只返回需要关联的公司,但我们需要返回所有公司

预期结果

1) 返回所有公司

2) 公司 company[0].contracts 的每个实例应仅返回与关联订阅者的合同或返回空数组

所以我们可以构建这样的 json 并排除合约块中的 if 条件:

json.data do
  json.companies @companies do |company|
    json.id company.id
    json.name company.name
    json.full_name company.full_name
    json.owner company.owner, :name, :email, :phones
    json.contracts company.contracts do |contract| # => should return contract by subscriber_id or empty array
      json.id contract.id
      json.company_id, contract.company_id
      json.status contract.status
    end
  end
end

【问题讨论】:

    标签: mysql ruby-on-rails database activerecord rails-activerecord


    【解决方案1】:

    也许可以试试这样的

    Company.joins('LEFT JOIN contracts ON companies.id = company_id').where(contracts: {subscriber_id: params[:id]})
    

    【讨论】:

    • 我们想排除这样的条件,只对包含正确信息的数据库提出一个正确的请求。这可能吗?
    • 此请求仅返回与当前订阅者有合同的公司。但我们需要返回所有公司。有关详细信息:1)如果公司与当前订户有合同,我们会返回这家公司和 company.contracts 应该只返回与当前订户的合同 2)如果公司与当前订户没有合同,我们会返回这个公司也是,但 company.contracts 应该返回空字符串
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多