← Extractions

Typical DDDomains in Rails Apps — Andrzej Krzywda at wroclove.rb 2022

Andrzej Krzywda argues that most Rails projects share the same 'typical' domains (pricing, inventory, shipping, invoicing, etc.) and should be split into an application layer (controllers, service objects, read models) and a Rails-independent domain layer where each domain is a pure function from commands to events, coordinated by processes. Service objects collapse into thin param-to-command mappers, read models stay decoupled, and rails_event_store is pitched as the most productive DDD tool for Ruby.

Model
claude-opus-4-7
Ingestion
d8d33c00
Input tokens
376,245
fresh
258,127
cached
105,333
cache write
12,785
Output tokens
16,412
Duration
248.3s
Roundtrips
7
Tool calls
26
Cost
$0.00
Nodes/edges extracted
32 / 67
Read set (nodes/edges)
181 / 2

Nodes (32)

update Typical DDDomains In Rails Apps talk
attrs {"type" => "talk"} {"date" => "2022-03-11", "type" => "talk"}
description Talk at wroclove.rb 2022. Andrzej Krzywda's wroclove.rb 2022 talk arguing that most Rails projects share the same 'typical' domains — pricing, ...
short_description Talk at wroclove.rb 2022. Andrzej Krzywda's wroclove.rb 2022 talk on typical domains and layered DDD in Rails.
create Params-Driven Development concept
kind (empty) concept
name (empty) Params-Driven Development
slug (empty) params-driven-development
attrs (empty) {"category" => "practice"}
description (empty) Anti-pattern Krzywda calls out: a controller receives a bag of params (possibly constructed in JavaScript or a view t...
short_description (empty) Anti-pattern: passing a bag of request params through controllers, services and models.
create Application Layer vs Domain Layer concept
kind (empty) concept
name (empty) Application Layer vs Domain Layer
slug (empty) application-layer-vs-domain-layer
attrs (empty) {"category" => "architecture"}
description (empty) Architectural split promoted in the talk: the application layer lives inside the Rails app and contains controllers, ...
short_description (empty) Two-layer split separating Rails-bound plumbing from a pure Ruby domain layer.
create Typical Domain concept
kind (empty) concept
name (empty) Typical Domain
slug (empty) typical-domain
attrs (empty) {"category" => "pattern"}
description (empty) Generic domain concept the talk highlights: domains like pricing, authentication, shipping, inventory, payments, taxe...
short_description (empty) Generic business domain (pricing, shipping, inventory…) repeated across almost every project.
create Domain as Function from Commands to Events concept
kind (empty) concept
name (empty) Domain as Function from Commands to Events
slug (empty) domain-as-function-from-commands-to-events
attrs (empty) {"category" => "pattern"}
description (empty) Krzywda's formulation of a domain in the talk: a domain is a function whose input is a set of granular commands (e.g....
short_description (empty) Modelling each domain as a pure function mapping input commands to output events.
create Business Process (Event-to-Command) concept
kind (empty) concept
name (empty) Business Process (Event-to-Command)
slug (empty) business-process-event-to-command
attrs (empty) {"category" => "pattern"}
description (empty) Mechanism the talk uses to let decoupled domains cooperate. A process captures a business checklist ('whenever A and ...
short_description (empty) Reactive rule mapping domain events onto commands on other domains to coordinate them.
create Read Model concept
kind (empty) concept
name (empty) Read Model
slug (empty) read-model
attrs (empty) {"category" => "pattern"}
description (empty) Concept in Krzywda's layered DDD: read models are persisted views (often a single Active Record table) that subscribe...
short_description (empty) Event-subscribed, persisted projection serving a specific UI or report.
create Service Object concept
kind (empty) concept
name (empty) Service Object
slug (empty) service-object
attrs (empty) {"category" => "pattern"}
description (empty) Long-standing Rails pattern Krzywda once advocated and calls a 'gateway drug' to DDD. Known under many names (service...
short_description (empty) Rails pattern of encapsulating a use case as a callable object; debated naming and semantics.
create Form Object concept
kind (empty) concept
name (empty) Form Object
slug (empty) form-object
attrs (empty) {"category" => "pattern"}
description (empty) Pattern for wrapping a web form's inputs and UI-level validations in a dedicated object, sitting just before service ...
short_description (empty) Object that wraps UI input and validations, separate from models and services.
create Aspect-Oriented Programming concept
kind (empty) concept
name (empty) Aspect-Oriented Programming
slug (empty) aspect-oriented-programming
attrs (empty) {"category" => "methodology"}
description (empty) Programming paradigm promoting separation of concerns via rules like 'whenever X happens do Y'. DHH showcased many Ra...
short_description (empty) Paradigm separating cross-cutting concerns via 'before/after' advice on events in code.
create Rails Event Store Event Browser tool
kind (empty) tool
name (empty) Rails Event Store Event Browser
slug (empty) rails-event-store-event-browser
attrs (empty) {"category" => "service"}
description (empty) UI that ships with rails_event_store for inspecting stored events. Written in Elm. With granular commands and events,...
short_description (empty) UI bundled with rails_event_store for browsing events, written in Elm.
create rails_event_store/ecommerce project
kind (empty) project
name (empty) rails_event_store/ecommerce
slug (empty) rails_event_store-ecommerce
attrs (empty) {"status" => "active", "license" => "open-source"}
description (empty) Arkency-maintained reference repository (github.com/RailsEventStore/ecommerce) showcasing the layered DDD approach in...
short_description (empty) Reference order-management / e-commerce Rails project demonstrating DDD with rails_event_store.
create Hotwire tool
kind (empty) tool
name (empty) Hotwire
slug (empty) hotwire
attrs (empty) {"category" => "framework"}
description (empty) Rails front-end approach mentioned as a natural complement to read models: because read models are commonly Active Re...
short_description (empty) Rails front-end approach using HTML-over-the-wire and Turbo Streams.
create Avo tool
kind (empty) tool
name (empty) Avo
slug (empty) avo
attrs (empty) {"category" => "library"}
description (empty) Rails admin panel gem mentioned alongside Active Admin. Magic-heavy: it tries to discover models and auto-generate a ...
short_description (empty) Rails admin UI gem that generates admin panels from models.
create Active Admin tool
kind (empty) tool
name (empty) Active Admin
slug (empty) active-admin
attrs (empty) {"category" => "library"}
description (empty) Popular Rails admin framework mentioned in the talk. Krzywda tried it and deleted it immediately because it magically...
short_description (empty) Rails admin framework auto-generating CRUD UIs against Active Record.
create Service objects are mappers from params to commands takeaway
kind (empty) takeaway
name (empty) Service objects are mappers from params to commands
slug (empty) service-objects-are-mappers-from-params-to-commands
attrs (empty) {"type" => "recommendation"}
description (empty) In the layered architecture Krzywda proposes, a service object's only job is to take params (from a form object or co...
short_description (empty) Shrink service objects to thin params-to-commands mappers.
create Form objects must not save takeaway
kind (empty) takeaway
name (empty) Form objects must not save
slug (empty) form-objects-must-not-save
attrs (empty) {"type" => "recommendation"}
description (empty) A recurring bug in thinking: developers make form objects save data. Form objects should only express UI shape and UI...
short_description (empty) Form objects handle UI input and validation only; persistence belongs to commands.
create Read models must not depend on each other takeaway
kind (empty) takeaway
name (empty) Read models must not depend on each other
slug (empty) read-models-must-not-depend-on-each-other
attrs (empty) {"type" => "recommendation"}
description (empty) A common mistake is to build a new read model by reading from another ('grab the product list from that read model an...
short_description (empty) Keep read models denormalised and independent; never read one from another.
create Don't reuse service objects across applications takeaway
kind (empty) takeaway
name (empty) Don't reuse service objects across applications
slug (empty) don-t-reuse-service-objects-across-applications
attrs (empty) {"type" => "recommendation"}
description (empty) Tempting but bad: reusing the same service object between the admin panel, public app, mobile API or a Shopify integr...
short_description (empty) Avoid sharing service objects between admin, public, mobile, Shopify, etc.
create Avoid params-driven development takeaway
kind (empty) takeaway
name (empty) Avoid params-driven development
slug (empty) avoid-params-driven-development
attrs (empty) {"type" => "recommendation"}
description (empty) Bundling params from the view/controller/JavaScript into a hash that flows through form objects, services and models ...
short_description (empty) Map request params to specific commands early instead of threading them through the stack.
create Don't modularise with microservices or engines takeaway
kind (empty) takeaway
name (empty) Don't modularise with microservices or engines
slug (empty) don-t-modularise-with-microservices-or-engines
attrs (empty) {"type" => "warning"}
description (empty) Krzywda warns against microservices ('I'm sorry for you guys'), Rails engines (Adrian agrees engines actually suck), ...
short_description (empty) Avoid microservices and Rails engines as your primary modularisation technique.
create Layered DDD is junior-friendly and estimation-friendly takeaway
kind (empty) takeaway
name (empty) Layered DDD is junior-friendly and estimation-friendly
slug (empty) layered-ddd-is-junior-friendly-and-estimation-friendly
attrs (empty) {"type" => "insight"}
description (empty) Common objection is that DDD makes juniors' lives harder; Krzywda argues the opposite. With small domain, read-model ...
short_description (empty) Small building blocks make onboarding and estimating easier than a big ball of mud.
create rails_event_store is the most productive DDD tool in Ruby takeaway
kind (empty) takeaway
name (empty) rails_event_store is the most productive DDD tool in Ruby
slug (empty) rails_event_store-is-the-most-productive-ddd-tool-in-ruby
attrs (empty) {"type" => "recommendation"}
description (empty) Krzywda's bold (self-admittedly biased) claim: compared to how DDD is tooled in Java, .NET and Python, rails_event_st...
short_description (empty) Bold claim: rails_event_store beats Java/.NET/Python equivalents for DDD.
create Is AOP a failed idea, and how does it relate to DDD? question
kind (empty) question
name (empty) Is AOP a failed idea, and how does it relate to DDD?
slug (empty) is-aop-a-failed-idea-and-how-does-it-relate-to-ddd
attrs (empty) {"answer_summary" => "AOP didn't really fail: Rails callbacks and Spring still use it. Event-driven DDD simulates 'af...
description (empty) Audience member (a former AOP fan) asks why AOP failed. Krzywda: at the Rails-framework level AOP is alive — DHH prom...
short_description (empty) Q&A on aspect-oriented programming's fate and overlap with event-driven DDD.
create How does GDPR deletion work if encrypted events are in backups? question
kind (empty) question
name (empty) How does GDPR deletion work if encrypted events are in backups?
slug (empty) how-does-gdpr-deletion-work-if-encrypted-events-are-in-backups
attrs (empty) {"answer_summary" => "Only PII fields inside events are encrypted; deleting the per-user key makes those fields unrea...
description (empty) Audience asks: if GDPR is solved by encrypting PII inside events and deleting the key, how do backups of those events...
short_description (empty) Q&A on handling GDPR erasure when event backups still contain encrypted PII.
create Risk of misidentifying domains during legacy re-architecture question
kind (empty) question
name (empty) Risk of misidentifying domains during legacy re-architecture
slug (empty) risk-of-misidentifying-domains-during-legacy-re-architecture
attrs (empty) {"answer_summary" => "Yes, it's a real trap — early aggressive modularisation (microservices, engines) around guessed...
description (empty) Audience member notes that the worst cost of modularisation — especially with microservices — is misidentifying domai...
short_description (empty) Q&A on the danger of modularising too early around wrong domain boundaries.
create Is layered DDD really junior-friendly? question
kind (empty) question
name (empty) Is layered DDD really junior-friendly?
slug (empty) is-layered-ddd-really-junior-friendly
attrs (empty) {"answer_summary" => "Partially: fresh tutorial-sized Rails apps are easier for juniors, but real Rails codebases oft...
description (empty) Audience member pushes back: juniors come from Rails tutorials where apps look different from this architecture, and ...
short_description (empty) Q&A challenging the claim that DDD structure helps juniors.
create Can you do DDD without event sourcing? question
kind (empty) question
name (empty) Can you do DDD without event sourcing?
slug (empty) can-you-do-ddd-without-event-sourcing
attrs (empty) {"answer_summary" => "Yes. Event sourcing is just a persistence mechanism; publish events even if state is stored in ...
description (empty) Audience asks if DDD works without event sourcing. Krzywda: yes — event sourcing is a persistence detail, so you can ...
short_description (empty) Q&A on whether event sourcing is mandatory for DDD.
create Where do you read from without event sourcing? question
kind (empty) question
name (empty) Where do you read from without event sourcing?
slug (empty) where-do-you-read-from-without-event-sourcing
attrs (empty) {"answer_summary" => "From read models. Read models are event-driven but not necessarily event-sourced — they persist...
description (empty) Follow-up: if not using event sourcing, where do I read from — the domain or the command handler? Krzywda: still from...
short_description (empty) Q&A on where queries live when persistence is not event-sourced.
create How do you test units with dependencies on other units? question
kind (empty) question
name (empty) How do you test units with dependencies on other units?
slug (empty) how-do-you-test-units-with-dependencies-on-other-units
attrs (empty) {"answer_summary" => "Prefer avoiding coupling. Where needed, use simple stubs/fakes. Assert on events produced or co...
description (empty) Audience asks how to test units that depend on other units — mocks, substitutions, or something else. Krzywda: avoid ...
short_description (empty) Q&A on isolating tests for domains, read models and processes.
create Can service objects and command handlers call each other? question
kind (empty) question
name (empty) Can service objects and command handlers call each other?
slug (empty) can-service-objects-and-command-handlers-call-each-other
attrs (empty) {"answer_summary" => "No — service objects don't call each other and command handlers don't invoke other commands dir...
description (empty) Audience asks if service objects or command handlers can call each other and whether dependency injection applies. Kr...
short_description (empty) Q&A on inter-service calls and dependency injection in layered DDD.
create Is building DDD from scratch too slow for the business? question
kind (empty) question
name (empty) Is building DDD from scratch too slow for the business?
slug (empty) is-building-ddd-from-scratch-too-slow-for-the-business
attrs (empty) {"answer_summary" => "Yes, upfront overhead exists, but the Rails 'fast first weeks, slow later' curve is the real tr...
description (empty) Audience asks whether setting up this architecture is too slow to justify to the business compared to a typical Rails...
short_description (empty) Q&A on the perceived overhead of layered DDD vs 'Rails way' delivery.

Edges (67)

update Andrzej KrzywdaauthoredTypical DDDomains In Rails Apps
context (empty) Delivered the talk at wroclove.rb 2022.
update Typical DDDomains In Rails Appspresented_atwroclove.rb 2022
context (empty) Single-speaker presentation at wroclove.rb 2022.
update Andrzej Krzywdaworks_atArkency
context Founder of Arkency; refers to 'our Arkency' when describing internal discussions. Krzywda is Arkency's founder and identifies the arkency rewriting practice in the talk.
update Andrzej Krzywdaworks_onrails_event_store
context Represents rails_event_store on the panel; talks about its roadmap and recent process-manager support. Self-identifies as one of the people behind rails_event_store.
create Typical DDDomains In Rails AppsaboutDomain-Driven Design
context (empty) Entire talk pitches a layered DDD approach in Rails.
relation (empty) about
source_node_id (empty) a4a2cd64-ecaf-4875-bc09-5eedcfc022b0
target_node_id (empty) 6e2f88bd-e521-41a3-91d4-aeb5f8fd2486
create Typical DDDomains In Rails AppsaboutTypical Domain
context (empty) Core thesis: typical domains (pricing, inventory, shipping…) repeat across Rails projects.
relation (empty) about
source_node_id (empty) a4a2cd64-ecaf-4875-bc09-5eedcfc022b0
target_node_id (empty) e83efcdd-0f60-42e7-a592-875b4a1eb7bc
create Typical DDDomains In Rails AppsaboutApplication Layer vs Domain Layer
context (empty) Introduces the two-layer architectural split as the fix for single-level modularisation.
relation (empty) about
source_node_id (empty) a4a2cd64-ecaf-4875-bc09-5eedcfc022b0
target_node_id (empty) 53d6ea59-be82-445c-a6d3-67c859164d65
create Typical DDDomains In Rails AppsaboutDomain as Function from Commands to Events
context (empty) Defines each domain as a function from commands to events.
relation (empty) about
source_node_id (empty) a4a2cd64-ecaf-4875-bc09-5eedcfc022b0
target_node_id (empty) 527bcfce-3d3b-4c7d-8a52-a78aafee612e
create Typical DDDomains In Rails AppsaboutBusiness Process (Event-to-Command)
context (empty) Processes coordinate otherwise-decoupled domains by reacting to events with commands.
relation (empty) about
source_node_id (empty) a4a2cd64-ecaf-4875-bc09-5eedcfc022b0
target_node_id (empty) 1e62988d-3ede-46a9-b603-4b4a2198adb6
create Typical DDDomains In Rails AppsaboutRead Model
context (empty) Read models as event-subscribed persisted projections for different applications.
relation (empty) about
source_node_id (empty) a4a2cd64-ecaf-4875-bc09-5eedcfc022b0
target_node_id (empty) d0fcf0df-1ca2-47f0-b431-8dbac005b44d
create Typical DDDomains In Rails AppsaboutService Object
context (empty) Revisits service objects and collapses them into param-to-command mappers.
relation (empty) about
source_node_id (empty) a4a2cd64-ecaf-4875-bc09-5eedcfc022b0
target_node_id (empty) b8d19b36-ebfb-4be1-bba5-790358c566d1
create Typical DDDomains In Rails AppsaboutForm Object
context (empty) Form objects belong before service objects; must not save.
relation (empty) about
source_node_id (empty) a4a2cd64-ecaf-4875-bc09-5eedcfc022b0
target_node_id (empty) 528fdc91-af2c-41c9-867b-4c894299596d
create Typical DDDomains In Rails AppsaboutParams-Driven Development
context (empty) Named and criticised as an anti-pattern in the talk.
relation (empty) about
source_node_id (empty) a4a2cd64-ecaf-4875-bc09-5eedcfc022b0
target_node_id (empty) 1f6ca2c5-30b7-4c1c-9240-6a15ef437ef7
create Typical DDDomains In Rails AppsaboutCommand Bus
context (empty) Service objects dispatch commands on a command bus the talk describes.
relation (empty) about
source_node_id (empty) a4a2cd64-ecaf-4875-bc09-5eedcfc022b0
target_node_id (empty) 3ccefa20-9ab9-418f-8b69-e3694ced8de9
create Typical DDDomains In Rails AppsaboutEvent Sourcing
context (empty) Discussed as an optional persistence mechanism for domains.
relation (empty) about
source_node_id (empty) a4a2cd64-ecaf-4875-bc09-5eedcfc022b0
target_node_id (empty) 687c9da2-de87-4fb2-a758-c7498f394fd5
create Typical DDDomains In Rails Appsaboutrails_event_store
context (empty) Demoed as the tooling for events, commands and read models.
relation (empty) about
source_node_id (empty) a4a2cd64-ecaf-4875-bc09-5eedcfc022b0
target_node_id (empty) 9e5cb718-6f86-4937-9b4c-eb77da3aede8
create Typical DDDomains In Rails Appsaboutrails_event_store/ecommerce
context (empty) Reference repo demonstrated during the talk.
relation (empty) about
source_node_id (empty) a4a2cd64-ecaf-4875-bc09-5eedcfc022b0
target_node_id (empty) aefe7a37-ebc5-4840-b03a-8bcca89a6ddd
create Typical DDDomains In Rails AppsaboutHanami
context (empty) Pointed to as a Rails-free host for the same domain layer; Hanami port is in progress.
relation (empty) about
source_node_id (empty) a4a2cd64-ecaf-4875-bc09-5eedcfc022b0
target_node_id (empty) 9e549b38-6071-4b4d-88ea-ca5c3d86afa7
create Typical DDDomains In Rails AppsaboutHotwire
context (empty) Argued to pair well with read models via Active Record broadcasts.
relation (empty) about
source_node_id (empty) a4a2cd64-ecaf-4875-bc09-5eedcfc022b0
target_node_id (empty) a0a8a415-bd9e-46ed-8ee3-8448312af347
create Typical DDDomains In Rails AppsaboutTrailblazer
context (empty) Cited as a popular modularisation attempt often later removed from codebases.
relation (empty) about
source_node_id (empty) a4a2cd64-ecaf-4875-bc09-5eedcfc022b0
target_node_id (empty) c25b5eef-3c08-4d09-9fc6-407f04f949a0
create Typical DDDomains In Rails AppsaboutGraphQL
context (empty) Cited as an application-layer integration that 'sucks too' but is fortunately manageable.
relation (empty) about
source_node_id (empty) a4a2cd64-ecaf-4875-bc09-5eedcfc022b0
target_node_id (empty) c6a1041c-3116-4194-b7f0-eba7cd4a7e64
create Typical DDDomains In Rails AppsaboutAvo
context (empty) Discussed as acceptable only if it can hook into service objects or commands.
relation (empty) about
source_node_id (empty) a4a2cd64-ecaf-4875-bc09-5eedcfc022b0
target_node_id (empty) f523171f-5f61-4e47-a115-b99aed7b7b99
create Typical DDDomains In Rails AppsaboutActive Admin
context (empty) Discussed and dismissed for directly manipulating Active Records.
relation (empty) about
source_node_id (empty) a4a2cd64-ecaf-4875-bc09-5eedcfc022b0
target_node_id (empty) 634dd272-9317-4cdf-a125-2ef253d585ab
create Typical DDDomains In Rails AppsaboutRails Event Store Event Browser
context (empty) Demoed as a UI that reduces debugging time with granular events and commands.
relation (empty) about
source_node_id (empty) a4a2cd64-ecaf-4875-bc09-5eedcfc022b0
target_node_id (empty) 9ecf0411-9420-49c9-83dd-113f48ef4612
create Typical DDDomains In Rails AppsaboutRuby on Rails
context (empty) Primary framework whose MVC, engines, callbacks and philosophy are re-examined.
relation (empty) about
source_node_id (empty) a4a2cd64-ecaf-4875-bc09-5eedcfc022b0
target_node_id (empty) 7aac705a-0987-49f2-b665-9d4e08a6acee
create Rails Event Store Event Browserrelated_torails_event_store
context (empty) Ships as part of rails_event_store.
relation (empty) related_to
source_node_id (empty) 9ecf0411-9420-49c9-83dd-113f48ef4612
target_node_id (empty) 9e5cb718-6f86-4937-9b4c-eb77da3aede8
create Rails Event Store Event BrowserusesElm
context (empty) The event browser is written in Elm.
relation (empty) uses
source_node_id (empty) 9ecf0411-9420-49c9-83dd-113f48ef4612
target_node_id (empty) 24c97237-b385-4ede-bcca-8194f293713a
create rails_event_store/ecommerceusesrails_event_store
context (empty) Reference project built on top of rails_event_store.
relation (empty) uses
source_node_id (empty) aefe7a37-ebc5-4840-b03a-8bcca89a6ddd
target_node_id (empty) 9e5cb718-6f86-4937-9b4c-eb77da3aede8
create Arkencyworks_onrails_event_store/ecommerce
context (empty) Arkency maintains the ecommerce reference repository.
relation (empty) works_on
source_node_id (empty) f8b4b616-ffd6-4eaa-a7b9-fdc07bb2cb27
target_node_id (empty) aefe7a37-ebc5-4840-b03a-8bcca89a6ddd
create Business Process (Event-to-Command)related_toProcess Manager
context (empty) The 'process' pattern in the talk is Krzywda's pragmatic form of a process manager.
relation (empty) related_to
source_node_id (empty) 1e62988d-3ede-46a9-b603-4b4a2198adb6
target_node_id (empty) 1b1d68aa-23bc-4410-8af3-f095676d9722
create Service objects are mappers from params to commandsfrom_talkTypical DDDomains In Rails Apps
context (empty) Central recommendation of the talk.
relation (empty) from_talk
source_node_id (empty) b66f5219-01b9-4380-b36c-a994aabd720f
target_node_id (empty) a4a2cd64-ecaf-4875-bc09-5eedcfc022b0
create Form objects must not savefrom_talkTypical DDDomains In Rails Apps
context (empty) Repeatedly emphasised in the talk.
relation (empty) from_talk
source_node_id (empty) d2b62809-6bab-4d98-a532-1cb931c71a59
target_node_id (empty) a4a2cd64-ecaf-4875-bc09-5eedcfc022b0
create Read models must not depend on each otherfrom_talkTypical DDDomains In Rails Apps
context (empty) Stated explicitly as a common mistake to avoid.
relation (empty) from_talk
source_node_id (empty) 52bd1a62-4a64-4fb5-8927-97bc1d9eb7bc
target_node_id (empty) a4a2cd64-ecaf-4875-bc09-5eedcfc022b0
create Don't reuse service objects across applicationsfrom_talkTypical DDDomains In Rails Apps
context (empty) Guidance given when discussing multiple application-layer apps.
relation (empty) from_talk
source_node_id (empty) c56d007a-ffc8-4c3d-a3b5-1cf738a46f97
target_node_id (empty) a4a2cd64-ecaf-4875-bc09-5eedcfc022b0
create Avoid params-driven developmentfrom_talkTypical DDDomains In Rails Apps
context (empty) Named as an anti-pattern to drop.
relation (empty) from_talk
source_node_id (empty) 498f5315-47a8-4035-a172-d9583658727b
target_node_id (empty) a4a2cd64-ecaf-4875-bc09-5eedcfc022b0
create Don't modularise with microservices or enginesfrom_talkTypical DDDomains In Rails Apps
context (empty) Warning given while surveying failed modularisation attempts.
relation (empty) from_talk
source_node_id (empty) a6e8d0c4-c981-4d7a-886e-115594bf1199
target_node_id (empty) a4a2cd64-ecaf-4875-bc09-5eedcfc022b0
create Layered DDD is junior-friendly and estimation-friendlyfrom_talkTypical DDDomains In Rails Apps
context (empty) Conclusion slide of the talk.
relation (empty) from_talk
source_node_id (empty) 4f28312e-169d-4bd8-be5d-f848f0f16a5c
target_node_id (empty) a4a2cd64-ecaf-4875-bc09-5eedcfc022b0
create rails_event_store is the most productive DDD tool in Rubyfrom_talkTypical DDDomains In Rails Apps
context (empty) The 'bold claim' near the end of the talk.
relation (empty) from_talk
source_node_id (empty) cd82f0a7-9586-4001-9880-71cb02cd3c53
target_node_id (empty) a4a2cd64-ecaf-4875-bc09-5eedcfc022b0
create Avoid params-driven developmentaboutParams-Driven Development
context (empty) Takeaway targets this specific anti-pattern.
relation (empty) about
source_node_id (empty) 498f5315-47a8-4035-a172-d9583658727b
target_node_id (empty) 1f6ca2c5-30b7-4c1c-9240-6a15ef437ef7
create Service objects are mappers from params to commandsaboutService Object
context (empty) Takeaway about the new role of service objects.
relation (empty) about
source_node_id (empty) b66f5219-01b9-4380-b36c-a994aabd720f
target_node_id (empty) b8d19b36-ebfb-4be1-bba5-790358c566d1
create Form objects must not saveaboutForm Object
context (empty) Takeaway about the role of form objects.
relation (empty) about
source_node_id (empty) d2b62809-6bab-4d98-a532-1cb931c71a59
target_node_id (empty) 528fdc91-af2c-41c9-867b-4c894299596d
create Read models must not depend on each otheraboutRead Model
context (empty) Guidance on decoupling read models.
relation (empty) about
source_node_id (empty) 52bd1a62-4a64-4fb5-8927-97bc1d9eb7bc
target_node_id (empty) d0fcf0df-1ca2-47f0-b431-8dbac005b44d
create Is AOP a failed idea, and how does it relate to DDD?asked_atTypical DDDomains In Rails Apps
context (empty) Asked during the talk's Q&A.
relation (empty) asked_at
source_node_id (empty) 5134b19c-da99-4747-96f0-a84ee3ffbd50
target_node_id (empty) a4a2cd64-ecaf-4875-bc09-5eedcfc022b0
create Is AOP a failed idea, and how does it relate to DDD?aboutAspect-Oriented Programming
context (empty) Topic of the question.
relation (empty) about
source_node_id (empty) 5134b19c-da99-4747-96f0-a84ee3ffbd50
target_node_id (empty) a0bf894d-a15c-4ccb-8345-198b5236403d
create How does GDPR deletion work if encrypted events are in backups?asked_atTypical DDDomains In Rails Apps
context (empty) Asked during Q&A.
relation (empty) asked_at
source_node_id (empty) ff7026ec-c443-4fbb-8e6a-7131a11bb4cf
target_node_id (empty) a4a2cd64-ecaf-4875-bc09-5eedcfc022b0
create How does GDPR deletion work if encrypted events are in backups?aboutrails_event_store
context (empty) About rails_event_store's GDPR-via-encryption approach.
relation (empty) about
source_node_id (empty) ff7026ec-c443-4fbb-8e6a-7131a11bb4cf
target_node_id (empty) 9e5cb718-6f86-4937-9b4c-eb77da3aede8
create Risk of misidentifying domains during legacy re-architectureasked_atTypical DDDomains In Rails Apps
context (empty) Asked during Q&A.
relation (empty) asked_at
source_node_id (empty) 0ed89f4d-8c0b-49ea-8189-a29bcaefb62d
target_node_id (empty) a4a2cd64-ecaf-4875-bc09-5eedcfc022b0
create Risk of misidentifying domains during legacy re-architectureaboutBounded Context
context (empty) Concerns how to draw domain boundaries correctly.
relation (empty) about
source_node_id (empty) 0ed89f4d-8c0b-49ea-8189-a29bcaefb62d
target_node_id (empty) bb2674d4-360e-4ac8-84a1-85be3230a187
create Is layered DDD really junior-friendly?asked_atTypical DDDomains In Rails Apps
context (empty) Asked during Q&A.
relation (empty) asked_at
source_node_id (empty) cadb76ce-6ca4-4c61-ab94-e0930dd8574c
target_node_id (empty) a4a2cd64-ecaf-4875-bc09-5eedcfc022b0
create Can you do DDD without event sourcing?asked_atTypical DDDomains In Rails Apps
context (empty) Asked during Q&A.
relation (empty) asked_at
source_node_id (empty) c3393ddb-03dc-47da-b582-bbe859c1c69a
target_node_id (empty) a4a2cd64-ecaf-4875-bc09-5eedcfc022b0
create Can you do DDD without event sourcing?aboutEvent Sourcing
context (empty) Topic of the question.
relation (empty) about
source_node_id (empty) c3393ddb-03dc-47da-b582-bbe859c1c69a
target_node_id (empty) 687c9da2-de87-4fb2-a758-c7498f394fd5
create Where do you read from without event sourcing?asked_atTypical DDDomains In Rails Apps
context (empty) Follow-up question in Q&A.
relation (empty) asked_at
source_node_id (empty) 9c21be0b-eea7-4c43-811c-3fe4a2a1c576
target_node_id (empty) a4a2cd64-ecaf-4875-bc09-5eedcfc022b0
create Where do you read from without event sourcing?aboutRead Model
context (empty) Answer centres on read models persisting themselves.
relation (empty) about
source_node_id (empty) 9c21be0b-eea7-4c43-811c-3fe4a2a1c576
target_node_id (empty) d0fcf0df-1ca2-47f0-b431-8dbac005b44d
create How do you test units with dependencies on other units?asked_atTypical DDDomains In Rails Apps
context (empty) Asked during Q&A.
relation (empty) asked_at
source_node_id (empty) f230a3d2-415f-463b-b419-c86efc56cbe2
target_node_id (empty) a4a2cd64-ecaf-4875-bc09-5eedcfc022b0
create How do you test units with dependencies on other units?aboutCommand Bus
context (empty) Answer: use fake command bus and assert events/commands.
relation (empty) about
source_node_id (empty) f230a3d2-415f-463b-b419-c86efc56cbe2
target_node_id (empty) 3ccefa20-9ab9-418f-8b69-e3694ced8de9
create Can service objects and command handlers call each other?asked_atTypical DDDomains In Rails Apps
context (empty) Asked during Q&A.
relation (empty) asked_at
source_node_id (empty) 86c88ab2-a445-4cb8-b540-465b718006c0
target_node_id (empty) a4a2cd64-ecaf-4875-bc09-5eedcfc022b0
create Can service objects and command handlers call each other?aboutService Object
context (empty) Question about service object composition.
relation (empty) about
source_node_id (empty) 86c88ab2-a445-4cb8-b540-465b718006c0
target_node_id (empty) b8d19b36-ebfb-4be1-bba5-790358c566d1
create Can service objects and command handlers call each other?aboutDependency Injection
context (empty) Answer discusses whether DI applies in this architecture.
relation (empty) about
source_node_id (empty) 86c88ab2-a445-4cb8-b540-465b718006c0
target_node_id (empty) 06941a97-6c62-4450-8f9a-16cf172f5dd8
create Is building DDD from scratch too slow for the business?asked_atTypical DDDomains In Rails Apps
context (empty) Asked during Q&A.
relation (empty) asked_at
source_node_id (empty) b43427ac-b2e2-408c-afb0-3f9a68d03438
target_node_id (empty) a4a2cd64-ecaf-4875-bc09-5eedcfc022b0
create Is building DDD from scratch too slow for the business?aboutRuby on Rails
context (empty) Contrasts DDD setup speed with Rails' initial velocity.
relation (empty) about
source_node_id (empty) b43427ac-b2e2-408c-afb0-3f9a68d03438
target_node_id (empty) 7aac705a-0987-49f2-b665-9d4e08a6acee
create Andrzej Krzywdarecommendsrails_event_store
context (empty) Pitches it as the most productive DDD tool in Ruby.
relation (empty) recommends
source_node_id (empty) 337ffd2c-5847-4b23-9ef7-e8f70aa4c66a
target_node_id (empty) 9e5cb718-6f86-4937-9b4c-eb77da3aede8
create Andrzej Krzywdarecommendsrails_event_store/ecommerce
context (empty) Directs the audience to clone the repo and use its good-first-issue tickets as a sandbox.
relation (empty) recommends
source_node_id (empty) 337ffd2c-5847-4b23-9ef7-e8f70aa4c66a
target_node_id (empty) aefe7a37-ebc5-4840-b03a-8bcca89a6ddd
create Andrzej KrzywdarecommendsHotwire
context (empty) Endorses Hotwire as a fit for read-model-driven views.
relation (empty) recommends
source_node_id (empty) 337ffd2c-5847-4b23-9ef7-e8f70aa4c66a
target_node_id (empty) a0a8a415-bd9e-46ed-8ee3-8448312af347
update Nick Suttererworks_onTrailblazer
context Author of Trailblazer; talk narrates the framework's evolution through 1.1, 2.0 and 2.1. Krzywda jokes about defending Trailblazer in front of Apotonique/Nick.
create Introduction To Event Sourcing How To Use It With RubyaboutEvent Sourcing
context (empty) Referenced by Krzywda as Pavel's preceding wroclove.rb 2022 talk where read models were introduced.
relation (empty) about
source_node_id (empty) cbb0c15f-f29f-47b4-b307-d9d591951fb7
target_node_id (empty) 687c9da2-de87-4fb2-a758-c7498f394fd5
update Grokking FP For The Practicing Rubyistpresented_atwroclove.rb 2022
context (empty) The functional programming talk Krzywda mentions as happening 'tomorrow'.
create 18 months of using hotwire and viewcomponent in productionaboutHotwire
context (empty) Krzywda refers to 'Yaroslav's' talk on view components and Hotwire earlier at the conference.
relation (empty) about
source_node_id (empty) 5d7d6506-60ed-44e3-a6f1-62858b836822
target_node_id (empty) a0a8a415-bd9e-46ed-8ee3-8448312af347

Read set

181 nodes

person Andrzej Krzywda search_nodes talk Typical DDDomains In Rails Apps search_nodes+get_node_edges talk How wroclove.rb impacts developers and companies search_nodes resource Rails Architect Master Class search_nodes talk Multi-region data governance in Rails application search_nodes concept Namespace-Based Folder Hierarchy search_nodes talk Business logic in Ruby search_nodes question Can parts of Eventide, Rails Event Store and Trailblazer be combined in one project? search_nodes tool aggregate_root search_nodes tool JSON API Resources search_nodes tool rails_event_store search_nodes tool Ruby Event Store search_nodes concept Event Store search_nodes tool Entity Store search_nodes project Event Store (project) search_nodes talk Applying CQRS & Event Sourcing on Rails applications search_nodes project Eventide search_nodes talk Event Sourcing and Actor model in Ruby search_nodes concept Domain-Driven Design search_nodes resource Implementing Domain-Driven Design search_nodes resource Domain-Driven Design: Patterns, Principles and Practices search_nodes resource Domain-Driven Design: Tackling Complexity in the Heart of Software search_nodes talk Might & Magic of Domain-Driven Design search_nodes talk The pillars of Domain Driven Design search_nodes question Does DDD require object-oriented programming? search_nodes resource Domain-Driven Rails search_nodes concept DDD Whirlpool search_nodes question How to apply DDD when the client refuses to learn ubiquitous language? search_nodes company Arkency search_nodes company SpaceX search_nodes takeaway Contribute to Arkency aggregates repository search_nodes tool Sync Space VR search_nodes project AnyCable search_nodes tool GraphQL search_nodes resource Rocket Real-Time Benchmark search_nodes tool RealtimeBoard search_nodes company Transloadit search_nodes event wroclove.rb 2022 search_nodes event wroclove.rb 2024 search_nodes event wroclove.rb 2023 search_nodes event wroclove.rb 2019 search_nodes event wroclove.rb 2025 search_nodes event wroclove.rb 2026 search_nodes event wroclove.rb 2018 search_nodes talk Mutation testing workshop wroclove.rb 2019 search_nodes talk Building LLM powered applications in Ruby search_nodes talk Ever shorter feedback loop search_nodes tool Rails 5.2 search_nodes talk 18 months of using hotwire and viewcomponent in production search_nodes tool Action Cable search_nodes talk When REST is Not Enough: Implementing Alternative Protocols in Ruby on Rails search_nodes talk Better WebPerformance with Rails search_nodes talk Building Rails SPAs in Frontend Ruby with Glimmer DSL for Web search_nodes talk Securing Rails applications search_nodes takeaway Prefer a simple top-to-bottom worker search_nodes talk No-build Utopia: Modern User Experiences with Rails & Web Standards search_nodes talk Toolbelt of a Seasoned Bug Hunter search_nodes concept Stateless Service Object search_nodes talk The Curse of Service Object search_nodes concept Null Object Pattern search_nodes takeaway Prefer class-method services over stateful service objects search_nodes tool interactor search_nodes tool acts_as_api search_nodes tool Hanami search_nodes project monolith framework search_nodes concept Cynefin Framework search_nodes talk Extracting logic from templates with Hanami Views search_nodes tool Rack search_nodes tool Ruby on Rails search_nodes talk Towards the post framework future search_nodes tool Ember.js search_nodes tool mini_magick search_nodes tool Trailblazer search_nodes tool TruffleRuby search_nodes concept Trailblazer Workflow search_nodes tool Ruby search_nodes concept Trailblazer Activity search_nodes talk Scientific Ruby Lightning Talk search_nodes concept Trailblazer Operation search_nodes talk Rubyana Gems and the Ractorous Rubetta Stones! search_nodes talk Ruby Standard Library Hidden Gems Lightning Talk search_nodes concept Event Sourcing search_nodes takeaway Use CQRS And Event Sourcing Independently search_nodes takeaway Event Sourcing Mind Shift Trade-off search_nodes takeaway Event Sourcing Enables Distribution search_nodes question How to persist commands in an event-sourced system? search_nodes talk Event Sourcing Anti Patterns and Failures search_nodes concept Snapshotting search_nodes takeaway Hiring For Event Sourcing Trade-off search_nodes concept CQRS search_nodes concept Entity Projection search_nodes concept Reservation Pattern search_nodes concept Projector search_nodes takeaway Don't Conflate Entity, Handler and Projection search_nodes concept Idempotent Projectors and Reactors search_nodes concept Aggregate Root Anti-Pattern search_nodes concept Embrace The Evented Model search_nodes concept Opaque Dependencies search_nodes takeaway Group models into folders by entity dependency search_nodes concept Flat Query Structure search_nodes concept Process Manager search_nodes concept Saga / Process Manager search_nodes concept Saga Pattern search_nodes question When is a command considered processed? search_nodes takeaway Handlers Must Control Their Dependencies search_nodes question Do events store current state, and how does replay perform? search_nodes concept Railway Oriented Programming search_nodes concept Application Logic vs Business Logic search_nodes concept Dependency Injection search_nodes concept Reactive Programming search_nodes question How to detect coupling in a large existing project? search_nodes concept Breadth-First Search for Code Removal search_nodes concept Boolean Flags as Implicit State search_nodes concept Architecture Drivers search_nodes concept Weasel Words search_nodes talk Introduction To Event Sourcing How To Use It With Ruby search_nodes talk Beyond the current state Time travel to the rescue! search_nodes question What is the biggest challenge with this approach? search_nodes question What is an entity? search_nodes concept Bounded Context search_nodes takeaway Introduce bounded-context controller namespaces search_nodes takeaway Bounded Contexts Are Not Microservices search_nodes takeaway Bounded Contexts Are Natural Microservice Seams search_nodes concept Context Map search_nodes takeaway One Ubiquitous Language Per Bounded Context search_nodes concept Distributed Monolith search_nodes tool Active Storage search_nodes concept Active Record search_nodes tool Devise search_nodes question What is an enterprise Rails application? search_nodes project granite search_nodes talk Working with RailsEventStore in Cashflow Management System search_nodes person Nick Sutterer search_nodes concept Command Form search_nodes talk Doctrine of Useful Objects Separate Fact from Fiction in OOD search_nodes talk SUPER AIN'T SUPER From OOP To FP and Beyond! search_nodes tool Reform search_nodes concept ObjectSpace heap dumps search_nodes tool dry-struct search_nodes talk Component Driven UI with ViewComponent search_nodes tool Cells search_nodes takeaway Adopt CSS-in-JS for modern component-based frontends search_nodes concept CSS-in-JS search_nodes takeaway Start with Action Cable, switch when performance hurts search_nodes concept Domain Model (vs Active Record Model) search_nodes question Does DDD apply to startups? search_nodes takeaway Risks of DDD: Hierarchy, Perfectionism, Constraints search_nodes tool PureScript search_nodes talk One machine please, make it Turing search_nodes talk Grokking FP For The Practicing Rubyist search_nodes tool Elixir search_nodes concept Pipeline Operator search_nodes talk FaaS for Ruby Lightning Talk search_nodes talk Adventures in durable execution search_nodes takeaway Build APIs with immutability, EDN, context-free, flat search_nodes concept Command Bus search_nodes concept Command Handler search_nodes concept Core Domain search_nodes talk Message Bus Decoupling Lightning Talk search_nodes concept Event Bus search_nodes takeaway Keep Entities Free Of Messaging search_nodes concept Message Store search_nodes question How do you deal with GDPR in an immutable event store? search_nodes concept Unique Per-Site Email Leak Detection search_nodes concept Command UUID Deduplication search_nodes takeaway Use Unique Per-Site Emails To Catch Leaks search_nodes takeaway Time Travel Superpower search_nodes question How do you deal with event versioning? search_nodes tool Elm search_nodes tool Wolfram Language search_nodes tool Rust search_nodes tool Babel search_nodes concept WebAssembly search_nodes tool Preact search_nodes tool Flow search_nodes takeaway Tooling Never Forced Your Monolith search_nodes concept MVC Modularity Violations search_nodes concept Majestic Monolith search_nodes talk How To Package A Rails Engine Generation To Automation search_nodes question Is MVC enough for a successful enterprise app? search_nodes talk Nightmare neighbours caveats of Rails based mutlitenancy search_nodes

2 edges