class RuboCop::Cop::Rails::ThreeStateBooleanColumn
t.boolean :active, default: true, null: false
t.column :active, :boolean, default: true, null: false
add_column :users, :active, :boolean, default: true, null: false
# good
t.boolean :active
t.column :active, :boolean
add_column :users, :active, :boolean
# bad
@example
`NOT NULL` constraint.
Enforces that boolean columns are created with default values (‘false` or `true`) and
def on_send(node)
def on_send(node) three_state_boolean?(node) do |column_node, options_node| options_node = options_node.first return if required_options?(options_node) def_node = node.each_ancestor(:def, :defs).first table_node = table_node(node) return if def_node && (table_node.nil? || change_column_null?(def_node, table_node, column_node)) add_offense(node) end end
def table_node(node)
def table_node(node) case node.method_name when :add_column node.first_argument when :column, :boolean ancestor = node.each_ancestor(:block).find do |n| n.method?(:create_table) || n.method?(:change_table) end ancestor&.send_node&.first_argument end end