2014-01-03 7 views
0

Я использую Rails 4. Я получил выход в выходной:Rails, как сортировать с гиперссылкой по количеству

<% @places.each do |place| %> 
    <tr> 
    <td> 
    All subscriptions: <%= Subscription.where(place_id: place.id).count %> 
    Males: <%= Subscription.where(user_gender: 'male', place_id: place.id).count %> 
    Females: <%= Subscription.where(user_gender: 'female', place_id: place.id).count %> 
    </td> 
    <td><p><%= image_tag place.place_photo(:small) %></td> 
    <td><%= place.title %></td> 
    <td><%= place.place_type.title %></td> 
    <td><%= place.content %></td> 
    <td><%= place.address %></td> 
    </tr> 
<% end %> 

И я хочу, чтобы сортировать subscriptions.count как я могу это сделать?

ответ

1

я предлагаю вам сделать 2 вещи. Сначала добавьте кэши счётчиков в свою модель подписки.

Добавление столбцов в таблице подписок с помощью миграции

add_column :subscriptions, :places_count, :integer, :default => 0 
add_column :subscriptions, :male_places_count, :integer, :default => 0 
add_column :subscriptions, :female_places_count, :integer, :default => 0 

Изменить свое место и подписок модели для обновления диссертаций отсчитывает

class Place 
    def update_subscription_counters 
    subscription.update_counters 
    end 
    after_create :update_subscription_counters 
    after_destroy :update_subscription_counters 
end 

class Subscription 
    def update_counters 
    self.places_count = places.count 
    self.male_places_count = places.male.count 
    self.female_places_count = places.female.count 
    self.save 
    end 
end 

Эти счетчики будут все тогда будет обновляться при создании/уничтожить место, и когда вы перечисляете свои места, вы не получите никаких ненужных запросов count.

Во-вторых, вы можете использовать их, чтобы заказать свои места.

class SubscriptionsController 
    def show 
    subscription = Subscription.find(params[:id]) 
    @places = subscription.places.includes(:subscription).order(:places_count) 
    end 
end 
2

если вы хотите отсортировать @places от subscriptoin подсчета:

@places.joins(:subscriptions).group("places.id").select("places.*, count(*) as subscriptions_count").order("subscriptions_count DESC").each do

Примечание: Вы должны сделать эти MySQL запросов в контроллере или модели, а не с вашей точки зрения.

Вы можете вывести подсчитывать подписки внутри вашего каждый просто используя <%= place.subscription_count %>, поскольку он включен с помощью выбора()

Смежные вопросы