Open6

Ruby on Rails

xy23dxy23d

Scope

preloadでの利用を考慮した場合にはアソシエーションを利用する必要がある

Model

app/models/child.rb
class Child < ActiveRecord::Base
 scope :active, -> { where(active: true) }
end
app/models/parent.rb
class Parent  < ActiveRecord::Base
 has_many: :active_child, -> {active}, class_name: :Child, foreign_key: parent_id
end
xy23dxy23d

Attribute Alias

カラムがポリモーフィズムで、ドメインでの利用は別名の場合

app/models/model.rb

test.rb
Class Test < ActiveRecord::Base
  ...
  alias_attribute :b, :a # aをbの別名でalias
  ...
end

whereの条件指定にも利用できる

Test.where(b: true)
xy23dxy23d

ActiveModel::Attributes に 独自の型を追加

独自の型クラスを作成

types/test.rb
Class Types::Test < ActiveModel::Type::Value
  def cast_value(value)
    # caseの内容を記載
  end
end

initializerで独自の型をregist

config/initializers/types.rb
Rails.application.reloader.to_prepare do
  ActiveModel::Type.register(:test, ::Types:Test)
end
xy23dxy23d

Routes

namespace + パラメータパターン

routes.rb
namespace :a do
  get 'b', trailing_slash: true
  get ':c', action: :show, trailing_slash:true
end

namespace + パラメータの場合、
toで指定すると#{namespace}::Controller@actionが要求されてしまう

actionで指定することで、#{namespace}Controller@actionが呼び出される

scope path付与

route.rb
scope :a, as: a do
  get 'b', trailing_slash: true
end

scopeas: aを指定することでa_b_pathとなる

xy23dxy23d

Rspec letの挙動

全体のテストに対するbeforeを設定した場合

_spec.rb
before do
  ...
end

describe 'test' do
  let!(:value) { 1 }
  ...
end

この時beforeのブロック内ではvalueが参照できない

回避策:

_spec.rb
let!(:value) { nil } # 各テストでoverride

before do
  ...
end

describe 'test' do
  let!(:value) { 1 }
  ...
end