MiraitSystems/enju_trunk

View on GitHub
app/controllers/series_statement_relationships_controller.rb

Summary

Maintainability
B
6 hrs
Test Coverage
# TODO: NACSIS-CATからのインポートに未対応
class SeriesStatementRelationshipsController < InheritedResources::Base
  add_breadcrumb "I18n.t('page.new', :model => I18n.t('activerecord.models.series_statement_relationship'))", 'new_series_statement_relationship_path', :only => [:new, :create]
  add_breadcrumb "I18n.t('page.showing', :model => I18n.t('activerecord.models.series_statement_relationship'))", 'series_statement_relationship_path(params[:id])',      :only => :show
  add_breadcrumb "I18n.t('page.editing', :model => I18n.t('activerecord.models.series_statement_relationship'))", 'edit_series_statement_relationship_path(params[:id])', :only => [:edit, :update]
  respond_to :html, :json
  has_scope :page, :default => 1
  load_and_authorize_resource

  def index
    @relationship_family =  RelationshipFamily.find(params[:relationship_family_id])
  end

  def new
    prepare_options
    @relationship_family = RelationshipFamily.find(params[:relationship_family_id])
  end

  def create
    @series_statement_relationship = SeriesStatementRelationship.new(params[:series_statement_relationship])
    @relationship_family = RelationshipFamily.find(params[:series_statement_relationship][:relationship_family_id])
    SeriesStatementRelationship.transaction do  
      @series_statement_relationship.save!
      # シリーズとの関連を設定
      if params[:series_statement_relationship][:before_series_statement_relationship_id].present?
        before_series_statement = SeriesStatement.find(params[:series_statement_relationship][:before_series_statement_relationship_id])
        before_series_statement.update_attributes!(relationship_family_id: @relationship_family.id)
      end
      if params[:series_statement_relationship][:after_series_statement_relationship_id].present?
        after_series_statement = SeriesStatement.find(params[:series_statement_relationship][:after_series_statement_relationship_id])
        after_series_statement.update_attributes!(relationship_family_id: @relationship_family.id)
      end
      redirect_to @series_statement_relationship
    end
  rescue
    prepare_options
    render :action => :new
  end

  def edit
    prepare_options
    @relationship_family = @series_statement_relationship.relationship_family
  end

  def update
    @relationship_family = @series_statement_relationship.relationship_family
    before_relationship_series_statement_ids = @series_statement_relationship.relationship_family.series_statements.map(&:id)
    SeriesStatementRelationship.transaction do  
      @series_statement_relationship.update_attributes!(params[:series_statement_relationship])
      after_relationship_series_statement_ids = @series_statement_relationship.relationship_family.series_statement_relationships.inject([]){ |ids, obj| 
        ids << obj.before_series_statement_relationship_id unless obj.before_series_statement_relationship_id.nil? 
        ids << obj.after_series_statement_relationship_id unless obj.after_series_statement_relationship_id.nil?
      }
      # シリーズとの関連を設定
      if params[:series_statement_relationship][:before_series_statement_relationship_id].present?
        before_series_statement = SeriesStatement.find(params[:series_statement_relationship][:before_series_statement_relationship_id])
        unless before_series_statement.relationship_family == @relationship_family
          before_series_statement.update_attributes!(relationship_family_id: @relationship_family.id)
        end
      end
      if params[:series_statement_relationship][:after_series_statement_relationship_id].present?
        after_series_statement = SeriesStatement.find(params[:series_statement_relationship][:after_series_statement_relationship_id])
        unless after_series_statement.relationship_family == @relationship_family
          after_series_statement.update_attributes!(relationship_family_id: @relationship_family.id)
        end
      end
     # after_relationship_series_statement_ids = @series_statement_relationship.relationship_family.series_statements.map(&:id)
      # 関連がなくなったシリーズへの処理
      (before_relationship_series_statement_ids - after_relationship_series_statement_ids).each do |id|
        series_statement = SeriesStatement.find(id)
        series_statement.update_attributes!(relationship_family_id: nil)
      end 
    end
    redirect_to @series_statement_relationship
  rescue
    prepare_options
    render :action => :edit
  end

  def destroy
    relationship_family = @series_statement_relationship.relationship_family
    SeriesStatementRelationship.transaction do
      @series_statement_relationship.destroy
      if relationship_family.series_statement_relationships.size == 0
        relationship_family.series_statements.each do |series_statement|
          series_statement.update_attributes!(relationship_family_id: nil)
        end
      end 
      redirect_to relationship_family
    end
  rescue
    flash[:notice] = t('series_statement_relationship.failed_destroy')
    redirect_to relationship_family
  end

  private
  def prepare_options
    #TODO 始端、終端を自動登録できるようにしたい
    #@series_statement_relationship_types = SeriesStatementRelationshipType.selectable.select([:id, :display_name])
    @series_statement_relationship_types = SeriesStatementRelationshipType.select([:id, :display_name])
                                             .inject([]){ |types, type| types << [type.display_name, type.id] }
  end
end