Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/67.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 Rails 4为子对象应用作用域_Ruby On Rails_Ruby_Activerecord - Fatal编程技术网

Ruby on rails Rails 4为子对象应用作用域

Ruby on rails Rails 4为子对象应用作用域,ruby-on-rails,ruby,activerecord,Ruby On Rails,Ruby,Activerecord,我正在尝试创建一个只返回父对象的受限对象的作用域: class BillingData scope :apply_restrictions, -> (restricted_numbers) { joins(billing_data: [:billing_data_lines]).where(billing_data_lines: {info_number: restricted_numbers }) } end 并这样称呼它: BillingData.a

我正在尝试创建一个只返回父对象的受限对象的作用域:

class BillingData
    scope :apply_restrictions, -> (restricted_numbers) {
        joins(billing_data: [:billing_data_lines]).where(billing_data_lines: {info_number: restricted_numbers })

    }
end
并这样称呼它:

BillingData.apply_restrictions(restricted_numbers)

这将起作用,或者只是返回匹配的任何内容。如何重构此作用域以返回主对象,但要使用已筛选的子账单数据行列表?

首先需要

  • 如果您还没有将
    有很多:账单数据行添加到您的
    账单数据
    模型中
  • 连接(计费数据:[:计费数据行])更改为
    连接(计费数据行)
然后,您可以启动
rails控制台
,查看将从您的作用域生成哪些SQL:

BillingDatum.apply_restrictions(123).to_sql
将返回(格式化为可读性):


这里要注意的关键是。因此,是的,您将只获得与指定条件匹配的父记录。

关联扩展

您可能希望使用

假设您有以下关联的一些模型;您应该能够在关联上设置自定义方法,以便仅从数据库返回特定记录:

#app/models/billing.rb
Class Billing < ActiveRecord::Base
   has_many :records do 
      def only_today
         where created_at: Date.today
      end
   end
end
#app/models/billing.rb
类计费
这将允许您拨打:

#app/controllers/billings_controller.rb
Class BillingsController < ApplicationController
   def show
      billing = Billing.find params[:id]
      @records = billing.records.only_today
   end
end
#app/controllers/billings_controller.rb
类BillingController<应用程序控制器
def秀
billing=billing.find参数[:id]
@记录=billing.records.only_今天
结束
结束
#app/controllers/billings_controller.rb
Class BillingsController < ApplicationController
   def show
      billing = Billing.find params[:id]
      @records = billing.records.only_today
   end
end