1. Add your migration file
There is a rails tool to help you make the file. For example, if I wanted to add an age column to the users table, I would run:
> rails g migration add_age_to_users age:integer
invoke active_record| def compose_attrs(a, b) | |
| result = a.dup | |
| b.each do |key, val| | |
| x = result[key] | |
| y = val | |
| pair = [ x, y ] | |
| if pair.any?(&:nil?) | |
| result[key] = x || y | |
| elsif pair.all? Hash | |
| result[key] = compose_attrs(x, y) |
| #!/usr/bin/env ruby | |
| # Check for -d flag | |
| if ARGV[0] == "-d" | |
| name = ARGV[1] | |
| delete_mode = true | |
| else | |
| name = ARGV[0] | |
| delete_mode = false | |
| end |
| import Base from "controllers/base"; | |
| export default class extends Base { | |
| static targets = ["checkbox", "toggler", "count", "menu", "hide"]; | |
| mount() { | |
| this.on("turbo:morph", document, this.update); | |
| this.on("click", this.togglerTarget, this.toggle); | |
| } |
| import {CSSTransition} from "react-transition-group" | |
| import {forwardRef, useImperativeHandle, useRef, useState} from "react" | |
| import {call} from "src/util/call" | |
| export function useDebut(args: {enter?: () => any; exit: () => any}) { | |
| const ref = useRef<any>() | |
| const api = { | |
| props: { | |
| ref, | |
| onExit: args.exit, |
| /* This could be a way to reduce (haha) the redux boilerplate. */ | |
| import {createStore} from "redux" | |
| function createReduxModel(prefix, config) { | |
| const actionType = (name) => `${prefix}_${name.toUpperCase()}_SET` | |
| class Model { | |
| constructor(store) { | |
| for (const [name] of Object.entries(config)) { |
| # Put this in the controller | |
| def filters_for_this_action | |
| _process_action_callbacks.select do |filter| | |
| ifs = filter.options[:if].first || 'true' | |
| unlesses = filter.options[:unless].first || 'false' | |
| eval(ifs) && !eval(unlesses) | |
| end.map { |filter| [filter.kind, filter.filter] } | |
| end |
| How to solve this "special" goals question. | |
| Since we are saving the questions through the cycle model via the | |
| `accepts_nested_attributes`, feature in Rails, we don't need to make | |
| more than one ajax call when saving the questions. When we save all | |
| the questions data, we will also use this "special" goals question (GQ) | |
| to add the following fields to the save data. | |
| * cycle.goals_question_type | |
| * cycle.goals_question_multchoice_desc |
| /** | |
| * FORM FIELD CONFIGURATION | |
| * | |
| * In the configure-cycle.js view, we will determine what type of | |
| * cycle we are dealing with, and choose the correct configuration | |
| * object. The keys of these configuration objects represent the file | |
| * name where the subview lives. The value represents the options | |
| * object that will be passed to the view's initialize() method. | |
| */ |
| # See if an object is "complete" and give it a score. Example useage | |
| # would look like this. | |
| CompletenessAnalyzer.new(object: Event.find(1), criteria: [ | |
| Criterion.new({ | |
| name: 'Audience', | |
| message: 'Whom is your event is intended for?', | |
| condition: ->(event) { event.audiences.empty? } | |
| }), | |
| Criterion.new({ | |
| name: 'Contact Info', |