2015-04-02 7 views
0

У меня есть модель Track с целочисленным атрибутом, называемым rank. Я обновляю рейтинг по конкретным действиям: слушает, скачивает, покупает, ect. Пример: когда трек загружен, в track_controller я использую track.increment!(:rank, by = 60)Авто-создание объекта ассоциации?

Я имею в виду создание модели ассоциации TrackRank поэтому я могу иметь метку времени в любое время ранг трека обновляется (так что я могу сделать качению 3-недельный запрос рейтинга трека для целей фильтрации и отображения).

За каждый раз, когда обновляется ранг attr attr, Есть ли способ автосоздания связанного объекта TrackRank?

Конечная цель: Уметь запрос сверху количество X дорожек, основанных на подсчете ранга в течение последних 3-х недель.

ответ

2

Вы можете добавить условный вызов обратно на обновление дорожки

class Track < ActiveRecord::Base 
    # ignored associations and stuff 
    after_update :create_track_rank, if: :rank_changed? 

    # ignored methods 

    private 
    def create_track_rank 
    track_ranks.create(data) 
    end 
end 
+0

Одно замечание - вы должны реорганизовать код, чтобы избежать ' increment', 'update_columns' и другие методы, которые пропускают обратные вызовы. – dimuch

+0

как бы я это сделал? если вы пишете обратный вызов и используете метод, который позволяет избежать обратных вызовов, я не думаю, что смогу это сделать. –

+0

Мой комментарий адресован Райан Ребо, я вижу, что он использует 'track.increment! (: Rank, by = 60)', обратный вызов в этом случае не будет работать. – dimuch

0

Вы можете обновить его на контроллере

class TracksController < ApplicationController 
    def update 
    @track.update! 
    TrackRank.create(@track) 
    end 
end 
Смежные вопросы