Skip to content

answer/ans-model-helpers

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

50 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

model に関連するヘルパー

日付ごとの集計を行うためのメソッド、スコープを定義する

date_column クラスメソッドを定義する

class ... < ActiveRecord::Base
  include Ans::Model::Helpers::DateSumup

  class << self
    def date_column
      :action_datetime
    end
  end
end

日付カラムがリレーション先のテーブルにある場合は、 association を定義して、配列で返す

class ... < ActiveRecord::Base
  include Ans::Model::Helpers::DateSumup

  belongs_to :date_column_table

  class << self
    def date_column
      [:date_column_table, :action_datetime]
    end
  end
end

spec は、 model, table, date_column メソッドを定義して、 it_should_behave_like を記述する

require "ans-model-helpers/shared_examples/date_sumup"

module ...SpecHelper
  def model
    Model
  end
  def table
    "models"
  end
  def date_column
    "action_datetime"
  end
end

describe "date_sumup_helper" do
  include ...SpecHelper
  it_should_behave_like "Ans::Model::Helpers::DateSumup"
end
params = { day: "日付" }

view の form で、日付を “day” で送信して、 params を直接このメソッドに指定すると簡単

@sumup, @day = Model.<sumup_scope>.day_in params[:sumup]

# @sumup = Model.<sumup_scope>.date_in(指定した日付)
# @day = 検索した日付の文字列
params = { month: "日付" }
params = { from: "日付", to: "日付" }

view の form で、日付を “month” か “from”, “to” で送信して、 params を直接このメソッドに指定すると簡単

@sumup, @total, (@from, @to) = Model.<sumup_scope>.days_in params[:sumup]

# @sumup = [(from から to までの日付の) Model.<sumup_scope>.date_in(一日分), ...]
# @total = Model.<sumup_scope>.date_in(from から to までの範囲)
# @from = 検索した開始日付
# @to = 検索した終了日付
options = { day: DateTime }
options = { from: DateTime, to: DateTime }

day で指定すると、その一日分の from - to where が設定される

from, to で指定すると、 from の日の最初から to の日の最後までの from - to where が設定される

引数はそれぞれ DateTime で指定する

日付カラムは date_column メソッドから取得するので、モデルには date_column メソッドを定義しなければならない

column を date_column ではなく、直接指定する以外は date_in と同じ

sql や association をテストするためのスペックヘルパー

belongs_to と has_many は sql 関係ないが同じ所に定義してある

model メソッドで使用するモデルを返すメソッドを定義しておく

フィクスチャ生成は FactoryGirl.create か Fabricate で行われる

module ...SpecHelper
  include Ans::Model::Helpers::SqlSpecHelper

  def model
    Model
  end
end

scope_は メソッドで呼び出すスコープを、 sql_は メソッドで期待する sql を指定する

require "ans-model-helpers/shared_examples/sql"

describe ..., ".scope_name" do
  include ...SpecHelper

  before do
    scope_は :scope_name
    sql_は do |sql|
      sql << "SELECT `model`.* from `model`"
    end
  end
  it_should_behave_like "Ans::Model::Helpers::Sql"
end

スコープと sql にパラメータを渡す場合は、 @scope_params, @sql_params を設定する

@scope_params はスコープにそのまま渡され、 @sql_params は sql_は メソッドのブロックに第二引数として渡される

describe ..., ".scope_name" do
  include ...SpecHelper

  before do
    scope_は :scope_name
    sql_は do |sql,p|
      sql << "SELECT `model`.* from `model` WHERE column = #{p[:column]}"
    end
  end
  context "... の場合" do
    before do
      scope_の引数は "params"
      sql_の引数は column: "params"
    end
    it_should_behave_like "Ans::Model::Helpers::Sql"
  end
end

method_は メソッドで呼び出すメソッドを、 sql_は メソッドで期待する sql を指定する

has_many_sql メソッドは、典型的な has_many な sql を返す、 proc を返す

require "ans-model-helpers/shared_examples/sql"

describe ... do
  include ...SpecHelper

  before do
    method_は :assoc_name
    sql_は &has_many_sql
  end
  it_should_behave_like "Ans::Model::Helpers::HasManySql"
end

sql が has_many_sql で返されるような典型的なものでない場合は、 scope のテストと同様、 sql をここで組み立てる

sql_は メソッドに引数を渡した場合、ブロックは無視される

has_many の対象のモデルが acts_as_paranoid な場合は、 has_many_paranoid_sql を代わりに使用する

method_は メソッドで呼び出すメソッドを、 sql_は メソッドで期待する sql を指定する

has_many_through_sql メソッドは、典型的な has_many :through な sql を返す、 proc を返す

require "ans-model-helpers/shared_examples/sql"

describe ... do
  include ...SpecHelper

  before do
    method_は :assoc_name
    sql_は &has_many_through_sql(:through_table_name)
  end
  it_should_behave_like "Ans::Model::Helpers::HasManySql"
end

sql が has_many_through_sql で返されるような典型的なものでない場合は、 scope のテストと同様、 sql をここで組み立てる

has_many の対象のモデルが acts_as_paranoid な場合は、 has_many_paranoid_through_sql を代わりに使用する

require "ans-model-helpers/shared_examples/sql"

describe ... do
  include ...SpecHelper

  before do
    method_は :assoc_name
  end
  it_should_behave_like "Ans::Model::Helpers::BelongsTo"
end
require "ans-model-helpers/shared_examples/sql"

describe ... do
  include ...SpecHelper

  before do
    method_は :assoc_name
  end
  it_should_behave_like "Ans::Model::Helpers::HasOne"
end

About

model に関連するヘルパー

Resources

Stars

Watchers

Forks

Packages

No packages published