2014-06-21 45 views
0

我試圖創建範圍,將只返回父對象的限制對象:軌道4應用範圍的子對象

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) 

這項工作或只是返回任何匹配的東西。我如何重構此範圍以返回主對象,但使用已過濾的Child_data_lines列表?

回答

1

首先你需要

  • 添加has_many :billing_data_linesBillingData模型,如果你還沒有
  • 變化joins(billing_data: [:billing_data_lines])joins(:billing_data_lines)

然後你就可以火起來rails console看什麼SQL將從您的示波器中生成:

BillingDatum.apply_restrictions(123).to_sql 

將返回(格式化的可讀性):

SELECT "billing_data".* FROM "billing_data" 
INNER JOIN "billing_data_lines" 
    ON "billing_data_lines"."billing_data_id" = "billing_data"."id" 
WHERE "billing_data_lines"."info_number" = 123 

這裏要注意的關鍵是the INNER JOIN keyword, which means that only the intersection of both tables is returned。所以是的,你只會得到符合指定條件的父記錄。

1

協會擴展

你不妨使用ActiveRecord Association Extension

說你有這些如下相關的一些機型;你應該能夠設置在關聯的自定義方法只從數據庫返回的特定記錄:

#app/models/billing.rb 
Class Billing < ActiveRecord::Base 
    has_many :records do 
     def only_today 
     where created_at: Date.today 
     end 
    end 
end 

這將允許您撥打:

#app/controllers/billings_controller.rb 
Class BillingsController < ApplicationController 
    def show 
     billing = Billing.find params[:id] 
     @records = billing.records.only_today 
    end 
end