rails polymorphic migrations foreign add_column ruby-on-rails foreign-key-relationship scaffold

ruby on rails - polymorphic - Rieles: Andamio para hacer automáticamente una relación de uno a muchos



rails rollback migration (5)

Los andamios son andamios. Cuando quiere algo más que un CRUD en una mesa (que es lo que es / hace un andamio), necesita alterar el código de andamio generado, o hacer el suyo propio.

No estoy seguro de si estoy leyendo esto bien, pero parece que Scaffold no hará una relación de uno a varios en su totalidad. Por ejemplo, si creo messages con scaffold y luego quiero comments sobre esos messages (un message -> muchos comments ), tengo que revisar y cambiar todo. Por ejemplo, tengo que cambiar esto en la new vista del comment

<% form_for(@comment) do |f| %>

a esto

<% form_for([@message, @comment]) do |f| %>

y luego cambie la acción para configurar @message var ... entre otras cosas.

Esto no se puede hacer de forma automática con Scaffold, ¿verdad?


Sí. Scaffold funciona para un modelo y un controlador relacionado. No cuida ni trabaja con las relaciones.

El objetivo principal de Scaffold es hacer que CRUD funcione en un modelo usando un controlador y vistas relacionadas. Eso es todo. Cualquier otro requisito, como las relaciones, debe codificarse manualmente.


Esto es cierto, pero no es el final de la historia. Hay al menos dos alternativas a Scaffold que funcionan bastante bien y automáticamente retoman las relaciones entre las clases (en función de los indicadores de relación de ActiveRecord como has_many). Una de estas alternativas es Optimizada y la otra es ActiveScaffold .

Son principalmente útiles para ingresar datos que su sistema requiere que no sean datos ingresados ​​por el usuario. Por ejemplo, los utilizo para tareas administrativas en tablas donde no tiene sentido crear una IU completa para CRUD cuando una de las alternativas de andamios hará bien el trabajo para una característica que rara vez se usa. Sin embargo, no querrás usarlos para comentarios sobre mensajes.


Tenga en cuenta que hay proyectos como Hobo for Rails que le permiten mantener sus campos y asociaciones dentro del modelo en sí. No puedes andamiar asociaciones, pero es bastante cercano.

Terminas pagando por este azúcar al tener muchas más aplicaciones creadas a tus espaldas. En lugar de ganar el tuyo propio, generalmente estás restando lo que necesitas de un gran banco de conductas preconstruidas.


No necesita un marco de administración de rieles pesados ​​para que funcionen las relaciones uno a muchos.

Puedes usar andamios para llegar la mayor parte del camino.

Un poco más de trabajo en el controlador y la vista _form te ayudarán el resto del camino hasta allí.

Así es cómo...

Story: Select a beer for a developer In order to select a beer for a developer As an admin I want a mainly scaffolded interface to select that beer Scenario 1: Select beer for new developer Given I have clicked the <new> button and entered the developer''s name When I click the beer dropdown Then I should be presented with a list of beers to choose from And that beer will be saved when I click <ok> Scenario 2: Select a different beer for existing developer Given I have clicked the <edit> button on the index page for a particular developer When I click the beer dropdown Then I should be presented with a list of beers to choose from And that beer will be saved when I click <ok>

Suponiendo que tenemos una mesa de cervezas :

create_table "beers", force: true do |t| t.string "name" t.datetime "created_at" t.datetime "updated_at" end

Y una tabla de desarrolladores que tiene una clave foránea (beer_id) que hace referencia a la tabla de cervezas:

create_table "developers", force: true do |t| t.string "name" t.integer "beer_id" t.datetime "created_at" t.datetime "updated_at" end

Podemos usar andamios para crear ambas tablas:

nombre de la cerveza $ rails g andamio

$ rails g nombre de desarrollador de andamio beer_id: integer

El comando de andamio crea los controladores y vistas para cada modelo.

Tendremos que modificar un poco nuestros controles y vistas para que el menú desplegable seleccione una cerveza para cada desarrollador:

app / views / developers / _form.html.erb

Reemplace el text_field generado y la etiqueta para beer_id con lo siguiente:

<div class="field"> <%= f.label :beer_id %><br /> <%= collection_select(:developer, :beer_id, @beers, :id, :name, {:prompt => false}) %> </div>

app / controllers / developer_controller.rb

Edite los métodos nuevos y de edición del controlador:

# GET /developers/new def new @developer = Developer.new @beers = Beer.all respond_to do |format| format.html # new.html.erb end end # GET /developers/1/edit def edit @beers = Beer.all respond_to do |format| format.html # new.html.erb end end

Capturas de pantalla

Notas

El andamio de Rails es genial. Mire todos los archivos que crea para usted:

$ be rails g scaffold beer name invoke active_record create db/migrate/20140912144218_create_beers.rb create app/models/beer.rb invoke rspec create spec/models/beer_spec.rb invoke factory_girl create spec/factories/beers.rb invoke resource_route route resources :beers invoke scaffold_controller create app/controllers/beers_controller.rb invoke erb create app/views/beers create app/views/beers/index.html.erb create app/views/beers/edit.html.erb create app/views/beers/show.html.erb create app/views/beers/new.html.erb create app/views/beers/_form.html.erb invoke rspec create spec/controllers/beers_controller_spec.rb create spec/views/beers/edit.html.erb_spec.rb create spec/views/beers/index.html.erb_spec.rb create spec/views/beers/new.html.erb_spec.rb create spec/views/beers/show.html.erb_spec.rb create spec/routing/beers_routing_spec.rb invoke rspec create spec/requests/beers_spec.rb invoke helper create app/helpers/beers_helper.rb invoke rspec create spec/helpers/beers_helper_spec.rb invoke jbuilder create app/views/beers/index.json.jbuilder create app/views/beers/show.json.jbuilder invoke assets invoke coffee create app/assets/javascripts/beers.js.coffee invoke scss create app/assets/stylesheets/beers.css.scss invoke scss create app/assets/stylesheets/scaffolds.css.scss

Todo lo que tienes que hacer es saber qué archivos modificar cuando quieras más que las operaciones CRUD básicas.

Espero que ayude. ~ Lex