Skip to content
This repository has been archived by the owner on May 18, 2021. It is now read-only.

Commit

Permalink
STI becomes method patch
Browse files Browse the repository at this point in the history
  • Loading branch information
PanfilovDenis committed Feb 4, 2013
1 parent 57be377 commit 97a5e78
Show file tree
Hide file tree
Showing 3 changed files with 39 additions and 10 deletions.
5 changes: 0 additions & 5 deletions app/controllers/web/admin/members_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -25,12 +25,7 @@ def edit

def update
@member = User.find(params[:id])
#TODO херовое решение, вынести или реализовать другой вариант
@member.type = :Member
@member.save

@member = @member.becomes(MemberEditType)

if @member.update_attributes params[:member]
flash_success
redirect_to admin_users_path
Expand Down
5 changes: 0 additions & 5 deletions app/controllers/web/admin/speakers_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -25,12 +25,7 @@ def edit

def update
@speaker = User.find(params[:id])
#TODO херовое решение, вынести или реализовать другой вариант
@speaker.type = :Speaker
@speaker.save

@speaker = @speaker.becomes(SpeakerEditType)

if @speaker.update_attributes params[:speaker]
flash_success
redirect_to admin_users_path
Expand Down
39 changes: 39 additions & 0 deletions config/initializers/active_record.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
module ActiveRecord
module Inheritance
extend ActiveSupport::Concern

module ClassMethods

# Monkey patch https://github.com/rails/rails/blob/master/activerecord/lib/active_record/inheritance.rb
# Необходим для изменения поведения метода becomes при использовании STI
# Данный патч позволяет с помощью метода becomes производить мутацию объекта и позволяет сохранять результат в БД
# Пример использования без патча:
# @member = Member.first #member.sti_name = "Member"
# @speaker = User.find(@member.id) #speaker.sti_name = "Member"
# @speaker = @speaker.becomes(SpeakerEditType) #speaker.sti_name = "Speaker"
# @speaker.update_attributes(password: "12345") #update НЕ ПРОИЗОЙДЕТ, ибо получится запрос вида
# UPDATE "users"
# SET "type" = 'Speaker', "password" = '12345'
# WHERE "users"."type" IN ('Speaker') !!! А в БД тип все еще "Member"
# AND "users"."id" = *

# Пример использования c патчем:
# @member = Member.first #member.sti_name = "Member"
# @speaker = User.find(@member.id) #speaker.sti_name = "Member"
# @speaker = @speaker.becomes(SpeakerEditType) #speaker.sti_name = "Speaker"
# @speaker.update_attributes(password: "12345") #update БУДЕТ УСПЕШНЫМ, ибо получится запрос вида
# UPDATE "users"
# SET "type" = 'Speaker', "password" = '12345'
# WHERE "users"."id" = *


def type_condition(table = arel_table)
# sti_column = table[inheritance_column.to_sym]
# sti_names = ([self] + descendants).map { |model| model.sti_name }
# sti_column.in(sti_names)
end

end

end
end

0 comments on commit 97a5e78

Please sign in to comment.