gpt4 book ai didi

ruby-on-rails - Rails 代码重构调用方法以处理 map

转载 作者:太空宇宙 更新时间:2023-11-03 16:12:31 25 4
gpt4 key购买 nike

我只是想知道是否有机会重新审视下面的代码并进行一些代码重构?

def call
inq_proc_ids = InquiryProcess.all.includes(inquiry_field_responses: :inquiry_field).select do |process|
process.inquiry_field_responses.select do |inquiry_field_responses|
inquiry_field_responses.inquiry_field.name == 'company_name'
end.last&.value&.start_with?(company_filter)
end.map(&:id)
InquiryProcess.where(id: inq_proc_ids)
end

我认为我应该在调用方法中只保留 InquiryProcess.where(id: inq_proc_ids) 但我不知道如何处理所有这些 .last&.value&.start_with?(company_filter).map(&:id) 东西。

编辑:

我试图将其拆分为新方法

def call
InquiryProcess.where(id: inquiry_process_id)
end

private

attr_reader :company_filter, :inquiry_field_response

def inquiry_process_id
InquiryProcess.all.includes(inquiry_field_responses: :inquiry_field).select do |process|
process.inquiry_field_responses.select_company_name
end.map(&:id)
end

def select_company_name
select do |inquiry_field_responses|
inquiry_field_responses.inquiry_field.name == 'company_name'
end.last&.value&.start_with?(company_filter)
end

但是我得到一个错误:

NoMethodError (undefined method `select_company_name' for ActiveRecord::Associations::CollectionProxy []>):

最佳答案

您发布的代码不仅难以理解,而且我记得在查询中使用预先计算的 ID 时,我们有一个连接到 ActiveReocrd 缓存的大量内存泄漏。

也就是说,我会尝试在单个 sql 查询中使用上面的内容:

def call
id_select = InquiryProcess
.joins(inquiry_field_responses: :inquiry_field)
.where(inquire_fields: { name: 'company_name' })
.where(InquiryField.arel_table[:value].matches("#{company_filter}%"))
.select(:id)

InquiryProcess.where(id: id_select)
end

请注意,id_select 不是 id 数组而是 ActiveRecord 作用域,上面将转换为以下 SQL:

SELECT "inquiry_processes".* 
FROM "inquiry_processes"
WHERE "inquiry_processes"."id" IN (
SELECT "inquiry_processes"."id"
FROM "inquiry_processes"
INNER JOIN ...
WHERE ...
)

然后回答另一个问题 - 为什么我们通过将 id 与同一表上的另一个子查询的结果进行匹配来查询表?这是为了避免在处理包含连接的事件记录关系时出现各种痛苦的问题——例如它会影响所有进一步的 includes 语句,因为预加载的关联将只包含与关系连接条件匹配的记录。

我真心希望您对这个位进行了很好的测试,或者您有人可以验证该行为的有效性。

关于ruby-on-rails - Rails 代码重构调用方法以处理 map ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58625452/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com