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.