rails form_with form_for form for ruby-on-rails ruby activerecord scaffolding

ruby-on-rails - form_with - select rails helper



Andamios ActiveRecord: dos columnas del mismo tipo de datos (3)

No tengo idea de cómo hacer esto con script / generate.

La idea subyacente es más fácil de mostrar sin usar script / generate de todos modos. Desea dos campos en su tabla / modelo de videojuegos que contengan las claves externas a la tabla / modelo de empresas.

Te mostraré cómo creo que se vería el código, pero no lo he probado, así que podría estar equivocado.

Su archivo de migración tiene:

create_table :videogames do |t| # all your other fields t.int :developer_id t.int :publisher_id end

Entonces en tu modelo:

belongs_to :developer, class_name: "Company", foreign_key: "developer_id" belongs_to :publisher, class_name: "Company", foreign_key: "publisher_id"

También mencionas querer que las dos compañías sean distintas, lo que podrías manejar en una validación en el modelo que verifica ese developer_id != publisher_id .

Otra pregunta básica de Rails:

Tengo una tabla de base de datos que debe contener referencias a exactamente dos registros diferentes de un tipo de datos específico.

Ejemplo hipotético: estoy haciendo una base de datos de videojuegos. Tengo una tabla para "Empresas". Quiero tener exactamente un desarrollador y exactamente un editor para cada entrada de "Videojuego".

Sé que si quiero tener una empresa, puedo hacer algo como:

script/generate Videogame company:references

Pero necesito tener ambas compañías. Prefiero no usar una tabla de unión, ya que solo puede haber exactamente dos del tipo de datos dado, y los necesito para que sean distintos.

Parece que la respuesta debería ser bastante obvia, pero no puedo encontrarla en ningún lado en Internet.


Si hay algún método o validación que desee específica para un tipo de empresa determinado, puede clasificar el modelo de la empresa. Esto emplea una técnica llamada herencia de tabla única. Para obtener más información, consulte este artículo: http://wiki.rubyonrails.org/rails/pages/singletableinheritance

Entonces tendrías:

#db/migrate/###_create_companies class CreateCompanies < ActiveRecord::Migration def self.up create_table :companies do |t| t.string :type # required so rails know what type of company a record is t.timestamps end end def self.down drop_table :companies end end #db/migrate/###_create_videogames class CreateVideogames < ActiveRecord::Migration create_table :videogames do |t| t.belongs_to :developer t.belongs_to :publisher end def self.down drop_table :videogames end end #app/models/company.rb class Company < ActiveRecord::Base has_many :videogames common validations and methods end #app/models/developer.rb class Developer < Company developer specific code end #app/models/publisher.rb class Publisher < Company publisher specific code end #app/models/videogame.rb class Videogame < ActiveRecord::Base belongs_to :developer, :publisher end

Como resultado, tendría modelos de la Compañía, Desarrollador y Editor para usar.

Company.find(:all) Developer.find(:all) Publisher.find(:all)


Solo para arreglar un poco las cosas, ahora también puedes hacer lo siguiente en tu migración:

create_table :videogames do |t| t.belongs_to :developer t.belongs_to :publisher end

Y como está llamando a las claves developer_id y publisher_id, probablemente el modelo sea:

belongs_to :developer, :class_name => "Company" belongs_to :publisher, :class_name => "Company"

No es un problema importante, pero me parece que a medida que se agrega el número de asociaciones con argumentos adicionales, las cosas menos claras se vuelven, por lo que es mejor mantener los valores predeterminados siempre que sea posible.