Open6
Ruby on Rails
ピン留めされたアイテム
はじめに
Ruby on Rails 開発メモ ※個人用
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
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)
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
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
scope
でas: a
を指定することでa_b_path
となる
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