2016-06-26 3 views
0

Так что у меня User модели и Post моделистолбца Обновления в базе данных от модели

Post принадлежит пользователю

Post имеет поле в базе данных под названием score

В Post модели I имеют метод, называемый score, который дает постовую оценку на основе полей (это необходимо сделать таким образом):

def score 
    score = 0 

    if self.title.present? 
    score += 5 
    end 
    if self.author.present? 
    score += 5 
    end 
    if self.body.present? 
    score += 5 
    end 

    score 

end 

Вопрос:

Есть грузы Users и грузы Posts. Так что я пытаюсь сделать это после того, как оценка будет разработана, я хочу сохранить ее в поле Post score в базе данных для каждого Post. Оценка должна быть обновлена, если пользователь обновит Post.

Я посмотрел на использование after_update :score!, но не понимают, как применить логику

+0

Почему вы это в модели? а не в контроллере? – Felix

+0

Вы также можете показать контроллер? – Felix

+0

как бы вы это сделали в контроллере, контроллер был создан с помощью стандартного генератора эшафотов, и я разрешил колонку оценки –

ответ

2

Это выглядит немного как вы пытаетесь заново изобретать колесо ActiveRecord предоставляет вам.

Если у вас есть поле базы данных score, то ActiveRecord автоматически обеспечит attribute_reader и attribute_writer для score, и вы не должны переопределять эти, если у вас есть на самом деле очень хорошая причина для этого, например вам нужно добавить в него некоторые другие ресурсы или какую-то серьезную бизнес-логику.

Существует способ более простой способ решить эту проблему, используя before_save крюк, который будет удар в перед любым #create или #update:

class Post 
    attribute_accessible :score # if you have Rails 4.x you can omit this line 

    before_save :update_score 

    private 
    def update_score 
    new_score = 0 
    self.score = [:title, :author, :body].each do |field| 
     new_score += 5 if send(field).present? 
    end 

    self.score = new_score 
    end 

Таким образом, ActiveRecord будет обрабатывать экономию для вас и вашего счета будет всегда обновляться. Дополнительно Post#score всегда будет возвращать реальное значение, которое в настоящее время сохраняется в базе данных

+1

действительно ценю помощь, а также за рефакторинг кода, GREAT! –

0

Вы можете сделать это, как этот after_update :score!

def score! 
    score = 0 

    if self.title.present? 
    score += 5 
    end 
    if self.author.present? 
    score += 5 
    end 
    if self.body.present? 
    score += 5 
    end 

    self.update_column(:score, score) 

end 

Это должно быть сделано в вашей Post модели.

0

Вы можете сделать это, используя метод update_column. Как:

def score 
    score = 0 

    if self.title.present? 
    score += 5 
    end 
    if self.author.present? 
    score += 5 
    end 
    if self.body.present? 
    score += 5 
    end 

    self.update_column(:score, score) 

end 
0

Вам необходимо переопределить метод установки в Почтовом модели

attr_accessible :score 

    def score=(value) 
    score = 0 
    if self.title.present? 
    score += 5 
    end 
    if self.author.present? 
    score += 5 
    end 
    if self.body.present? 
    score += 5 
    end 
    write_attribute(:score, score) 
    end