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