2016-04-13 33 views
1

Ben iki model var:Raylar serialize ilgili veriler

class ContinentsController < ApplicationController 
    def index 
    @continents = Continent.all 
    render json: @continents 
    end 
end 

ve seri hale:

İşte
class ContitnentSerializer < ActiveModel::Serializer 
    attributes :name, :countries 
end 

Sorunum başlar

class Continent < ActiveRecord::Base 
    has_many :countries 
end 

class Country < ActiveRecord::Base 
    belongs_to :continent 
end 

ben gibi denetleyici yarattı. Yalnızca, değerin HTTP GET params'ından geldiği durumun verildiği ülkeleri serileştirmek istiyorum. E.g ülke dizelleştiricinin yalnızca popülasyonun params [: popülasyon] 'dan fazla olması durumunda görüntülenmelidir. Sorun, serileştiricinin içinde, bunu incelemek için paramize erişimimiz yok.

[ 
{ 
    name: 'Europe' 
    countries: [ 
    { 
     name: 'Italy', 
     population: 1000000 
    } 
    ] 
}, 
{ 
    name: 'Africa' 
    countries: [ 

    ] 
} 
] 

Tabloya koşuluyla katılmayı denedim, ancak çalışmıyor gibi görünüyor.

@continents = Continent.all.joins("LEFT JOIN countries ON countries.continent_id = continents.id AND countries.population > #{params[:population]}") 
+0

Diziselleştiriciye denetleyiciden bir parametre iletebilirsiniz. Burada daha fazla ayrıntı: http://stackoverflow.com/a/26780514/1466095 –

cevap

1

bir kapsam oluşturun ve kumandadan param değerle kapsamını çağrı: Artık Deneyebilirsin Continent.all

Continent.population_more_than(params[:population]) 
+0

tüm ülkeleri geri dönmek yerine – mike927

+0

koşuluna göre azaltılmış gibi görünüyor, neyin yanlış olabileceğini biliyor musunuz? – mike927

+0

Umm, kesinlikle emin değilim. Sonunda param olarak geçmeden sorgudaki "popülasyonu" enterpolasyona deneyebilirsiniz. Denemek isteyebileceğiniz başka bir şey, 'popülasyonu' bu gibi bir dizide sarmalayın: 'scope: nüfus_more_than, -> (nüfus) {all.joins ("LEFT JOIN ülkeleri ON countries.continent_id = continents.id VE countries.population>?" [nüfus])} – Babar

0

yerine denetleyicisinden diyoruz

scope :population_more_than, ->(population) {all.joins("LEFT JOIN countries ON countries.continent_id = continents.id AND countries.population > ?", population)} 

@continents = Continent.all 
@continents.num_population = params[:population] 
render json: @continents.to_json(methods: :countries_with_population_gt) 
senin Continent modelinde

attr_accessor :num_population 

def countries_with_population_gt(num_population=0) 
    countries.where('population > ?', @num_population) 
end 
0

Temel olarak, belirli bir kural kapsamına giren sadece Continent s seçmeniz gerekir. Bu sık kullanılan bir filtre ise, o zaman Babar'ın önerisi ile gidip bir kapsam oluşturur.

Eğer bu bir seferlik bir seçim ise, o zaman benim modelleri sık sık kullanılmayan kapsamları ile karışıklık olmadan sadece orada filtreleme yapmak tercih ederim.

Continent.joins(:countries).where("countries.population > :population", population: params[:population]) 

# Or event shorter 
Continent.joins(:countries).where("countries.population > :population", params)