Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 需要帮助重构才能使用.where子句-RubyonRails_Ruby On Rails_Where Clause - Fatal编程技术网

Ruby on rails 需要帮助重构才能使用.where子句-RubyonRails

Ruby on rails 需要帮助重构才能使用.where子句-RubyonRails,ruby-on-rails,where-clause,Ruby On Rails,Where Clause,我有以下代码,这是遗留代码,我需要将其重构为。where子句,但我在重构过程中遇到了问题,以及最佳的重构方法 这是密码 #传统 @借方交易=FinancialTransaction.legacy\u查找( :全部, :include=>[:项目、部门、股票、借方账户、贷方账户、交易类型], :conditions=>[“dr_account_id=?”,@customer.id], :order=>financial_transactions.id desc', :限制=>20) #重构尝试 @

我有以下代码,这是遗留代码,我需要将其重构为
。where
子句,但我在重构过程中遇到了问题,以及最佳的重构方法

这是密码

#传统
@借方交易=FinancialTransaction.legacy\u查找(
:全部,
:include=>[:项目、部门、股票、借方账户、贷方账户、交易类型],
:conditions=>[“dr_account_id=?”,@customer.id],
:order=>financial_transactions.id desc',
:限制=>20)
#重构尝试
@借记交易=金融交易。其中(存款账户id:@存款账户id,客户:@customer.id)。订单('financial存款账户id desc')。限额(20)
#遗产
联系_或=“”
如果@customer.contacts.present,联系人或='或(?)中的联系人id?
@客户投诉=Event.legacy\u find(:all,{:order=>'id desc',:limit=>10,:conditions=>[“投诉为真且(客户账户\ id=?{contact\或})”,@customer.id]。如果(@customer.contacts.to\ a.map(&:id),@customer.contacts.present?)推送投诉
#重构尝试
@客户投诉=事件。其中(投诉:true,客户账户id:[@customer\u account\u id],客户:@customer.id)。订单('id desc')。限额(10)
任何帮助都将不胜感激

编辑一些可能有助于理解遗留问题的方法\u查找

def self.legacy\u find(类型,args=nil)
#需要添加处理id数组的功能
如果键入.kind_([数字、字符串、数组]&&&!args
结果=self.find(类型)
埃尔西夫!args
结果=self.send(type.to_s)
其他的
结果=自我
if type.kind_of?(数组)
如果args[:条件]
参数[:条件]=[“1=1”]
elsif args[:条件].类型?(字符串)
args[:条件]=[args[:条件]]
终止
args[:条件][0]='('+args[:条件][0]+')
args[:conditions][0]+=”和“+self.table_name+”.`id`in(“+type.join(',')+”)
elsif类型&!类型.种类?(符号)
如果args[:条件]
参数[:条件]=[“1=1”]
elsif args[:条件].类型?(字符串)
args[:条件]=[args[:条件]]
终止
args[:条件][0]='('+args[:条件][0]+')
args[:conditions][0]+=”和“+self.table_name+”.`id`=?”
args[:条件].push(类型)
终止
结果=self.legacy_条件(args)
if type&((type.kind_of?(String)&&type.to_i.to_s==type)| | type.kind_of?(数值))
result=result.first
elsif类型&!类型.种类?(符号)
result=result.to_a
其他的
结果=类型?result.send((type==:all?)to_a::type).to_s):结果
终止
终止
新结果=结果
返回新的结果
终止
def self.legacy_计数(args=nil)
新\u结果=self.legacy\u条件(args).count
终止
定义自身遗留值总和(列,参数=零)
新结果=自身旧条件(args).sum(col.to_)
终止
def自身遗留_条件(参数)
返回自我如果!args
args[:条件]=[]如果args[:条件]&args[:条件][0]。种类?(字符串)&args[:条件][0]。大小==0
结果=自我
result=result.where(args[:conditions])if(args.has_key?(:conditions)&&args[:conditions]&&args[:conditions]。大小>0)
如果args.has_key?(:select)和&args[:select],则result=result.select(args[:select])
结果=结果包括(args[:包括]),如果args.有_键(:包括)和&args[:包括]
result=result.includes(args[:include_而不带_引用])如果args.有_键(:include_而不带_引用)和&args[:include_而不带_引用]
如果args.has_key?(:include)和&args[:include],则result=result.references(args[:include])
如果args.has_key?(:joins)和&args[:joins],则result=result.joins(args[:joins])
如果args.has_key?(:order)和&args[:order],则result=result.order(args[:order])
结果=结果组(args[:group]),如果args.具有_键(:group)和&args[:group]
结果=结果限制(参数[:限制]),如果参数有_键(:限制)和&args[:限制]
结果=结果偏移量(参数[:偏移量]),如果参数有_键(:偏移量)和&args[:偏移量]
如果args.具有_键(:from)和&args[:from],则result=result.from(args[:from])
结果=结果锁(args[:锁]),如果args.有_key?(:锁)和&args[:锁]
如果args.has_key?(:readonly)和&args[:readonly],则result=result.readonly(args[:readonly])
后果
终止
老实说,我无法理解为什么会有这种代码,所以我正试图逐步淘汰它

编辑2 根据下面的答案,我得出以下结论

Mysql2::Error: Unknown column 'sales_orders.customer_account_id' in 'where clause': SELECT  `sales_orders`.* FROM `sales_orders` WHERE `sales_orders`.`customer_account_id` IS NULL ORDER BY `sales_orders`.`id` DESC LIMIT 10
@debit\u transactions=金融交易
.包括(:项目,:部门,:库存,:借方账户,:贷方账户,:交易类型)
.where(dr_account_id:@dr_account_id)
.订单(id::desc)
.限额(20)
@信用交易=金融交易
.包括(:项目,:部门,:库存,:借方账户,:贷方账户,:交易类型)
.其中(cr账户id:@cr账户id)
.订单(id::desc)
.限额(20)
联系_或=“”
如果@customer.contacts.size>0,则contact_or='或(?)中的contact_id
@客户投诉=事件。地点(客户账户号:@customer\u id,投诉:true)。订单号(id::desc)。限额(10)。或(事件地点(联系人号:@customer.contacts)),如果@customer.contacts.present?
@customer\u leads=事件。其中(customer\u account\u id:@customer\u id,lead:true)。订单(id::desc)。限额(10)
@customer\u quotes=salequote.where(customer\u account\u id:@customer\u id)。或(salequote.where(contact\u id:@contact\u id))。订单(id::desc)。限额(10)
@customer\u orders=salesforder.where(customer\u account\u id:@customer\u id).订单(id::desc).限额(10)
@客户发票=发票。其中(客户账户id:@customer\u id)。订单(id::desc)。限额(10)
@customer\u credits=CreditNote.where(customer\u account\u id:@customer\u id).订单(id::desc).限额(10)
@customer\u opportunities=Opportunity.where(customer\u account\u id:@customer\u id).或(Opportunity.where(contact\u id:@contact\u id)).订单(id::desc).限额(10)
@客户估算=估算。其中(客户
@debit_transactions = FinancialTransaction
 # you missed the includes
 .includes(
    :project, :department, :stock, :debit_account, 
    :credit_account, :transaction_type
  )
  .where(
    dr_account_id: @dr_account_id.id,
  )
  .order(id: :desc)
  .limit(20)
@debit_transactions = FinancialTransaction.where(
  id: [1,2,3]
)
Event.where(contact_id: @customer.contacts)
scope = Event.where(customer_account_id: @customer_id)
scope = scope.or(Event.where(contact_id: @customer.contacts)) if @customer.contacts.present?
scope = Event.where(
  customer_account_id: @customer_id
  complaint: true
).order('id desc')
.limit(10)
scope = scope.or(Event.where(contact_id: @customer.contacts)) if @customer.contacts.present?
@debit_transactions = FinancialTransaction.legacy_find(
        :all,
        :include => [:project, :department, :stock, :debit_account, :credit_account, :transaction_type],
        :conditions => ["dr_account_id = ?", @customer.id],
        :order => 'financial_transactions.id desc',
        :limit => 20)

# refactor attempt
@debit_transactions = FinancialTransaction
  .where(dr_account_id: @dr_account_id, customer: @customer.id)
  .order('financial_transactions.id desc')
  .limit(20)
# ...
result = result.includes(args[:include]) if args.has_key?(:include) && args[:include]
result = result.references(args[:include]) if args.has_key?(:include) && args[:include]
# ...
@debit_transactions = FinancialTransaction
  .includes([:project, :department, :stock, :debit_account, :credit_account, :transaction_type])
  .references([:project, :department, :stock, :debit_account, :credit_account, :transaction_type])
  .where(dr_account_id: @dr_account_id, customer: @customer.id)
  .order('financial_transactions.id desc')
  .limit(20)
# legacy
contact_or = ''
contact_or = ' OR contact_id IN(?) ' if  @customer.contacts.present?

@customer_complaints = Event.legacy_find(
  :all,
  :order => 'id desc',
  :limit => 10,
  :conditions => ["complaint is true and (customer_account_id = ? #{contact_or} )", @customer.id].push_if(@customer.contacts.to_a.map(&:id), @customer.contacts.present?)
)

# refactor attempt
@customer_complaints = Event
  .where(complaints: true, customer_account_id: [@customer_account_id], customer: @customer.id)
  .order('id desc')
  .limit(10)
Event.where(customer_account_id: [@customer_account_id])
  .or(Event.where(customer: @customer.id))
  .merge(Event.where(complaints: true))
  .order('id desc')
  .limit(10)