在Rails 5中,在has_and_belongs_to_many和属于关系

时间:2016-10-12 18:15:06

标签: ruby-on-rails ruby activerecord

给出以下模型结构;

class Project < ApplicationRecord
  has_many :leads
  has_and_belonds_to_many :clients
end

class Lead < ApplicationRecord
  belongs_to :project
end

class Client < ApplicationRecord
  has_and_belongs_to_many :projects
end

如何建议报告Client上的重复潜在客户?

现在我正在做一些非常粗糙的事情,有扁平和重要的事情,感觉应该有一种&#39; Ruby方式&#39;。

理想情况下,我希望界面能够说出Client.first.duplicate_leadsLead.first.duplicate?

当前(可怕的)解决方案

@duplicate_leads = Client.all.map(&:duplicate_leads).flatten

Class Client
  def duplicate_leads
    leads = projects.includes(:leads).map(&:leads).flatten
    grouped_leads = leads.group_by(&:email)
    grouped_leads.select { |_, v| v.size > 1 }.map { |a| a[1][0] }.flatten
  end
end

环境

  • Rails 5
  • Ruby 2.3.1

2 个答案:

答案 0 :(得分:1)

你可以试试这个。

class Client < ApplicationRecord
  has_and_belongs_to_many :projects
  has_many :leads, through: :projects

  def duplicate_leads
    duplicate_ids = leads.group(:email).having("count(email) > 1").count.keys
    Lead.where(id: duplicate_ids)
  end
end

答案 1 :(得分:0)

您可以尝试创建从Lead到Project的has_many关联返回到Lead,其中您使用lambda根据两条记录之间的电子邮件匹配动态加入,并且id不匹配。这会将两个记录都标记为重复 - 如果您只想标记一个,那么您可以要求一个的id小于另一个的id。

一些提示:Rails has_many with dynamic conditions