10

He encontrado un antiguo complemento llamado acts_as_habtm_list, pero es para Rails 1.0.0.acts_as_list con has_and_belongs_to_many relación

¿Está esta funcionalidad incorporada en acts_as_list ahora? Parece que no puedo encontrar ninguna información al respecto.

Básicamente, tengo una tabla artists_events - sin modelo. La relación se maneja a través de esos dos modelos que especifican: has_and_belongs_to_many

¿Cómo puedo especificar el orden en esta situación?

+0

¿Podría ser más específico? ¿Qué estás tratando de lograr exactamente? También un enlace al plugin que encontraste sería agradable. – EmFi

+0

Cuando busqué el complemento, encontré uno más nuevo que podría usar: http://github.com/SFEley/habtm_list Estoy tratando de lograr el orden de los artistas en los eventos: por ejemplo, vaya a un concierto con un techo y dos abridores. Me gustaría que muestre el orden en el que los artistas están jugando. – mculp

Respuesta

22

Supongo que tiene dos modelos: artista y evento.

Quiere tener una relación habtm entre ellos y quiere poder definir un orden de eventos para cada artista.

Aquí está mi solución. Estoy escribiendo este código de mi cabeza, pero una solución similar funciona en mi caso. Estoy bastante seguro de que hay margen de mejora.

Estoy usando el complemento de carriles acts_as_list.

Así es como me gustaría definir modelos:

class Artist < ActiveRecord::Base 
    has_many :artist_events 
    has_many :events, :through => :artist_events, :order => 'artist_events.position' 
end 

class Event < ActiveRecord::Base 
    has_many :artist_events 
    has_many :artists, :through => :artist_events, :order => 'artist_events.position' 
end 

class ArtistEvent < ActiveRecord::Base 
    default_scope :order => 'position' 
    belongs_to :artist 
    belongs_to :event 
    acts_as_list :scope => :artist 
end 

Como se puede ver que necesita un modelo ArtistEvent adicional, uniéndose a los otros dos. La tabla artist_events debe tener dos ID extranjeros y una posición de columna adicional.

Ahora puede utilizar acts_as_list métodos (en el modelo ArtistEvent, por desgracia), pero algo así como

Artist.find (: id) .events

debería darle una lista de eventos que pertenecen al artista específico en correcta orden.

+0

Mi única queja al aceptar esta respuesta es que estoy usando: has_and_belongs_to_many y no tengo un modelo. Es este código equivalente? – mculp

+3

has_and_belongs_to_many es considerado por muchos como obsoleto.La solución de modelo Join le ofrece la misma funcionalidad que el método habtm, pero es mucho más flexible. –

+0

Ver la actualización de Tricia a continuación. Tienes que agregar un: primario a la tabla intermedia para que esto funcione. – Wilhelm

1

I tratando con referencia a sí misma como la

class Product < ActiveRecord::Base 
    has_many :cross_sales 
    has_many :cross_sales_products, :through => :cross_sales, :order => 'cross_sales.position' 
end 

class CrossSale < ActiveRecord::Base 
    default_scope :order => 'cross_sales.position' 
    belongs_to :product 
    belongs_to :cross_sales_product, :class_name => "Product" 
    acts_as_list :scope => :product 
end 

create_table :cross_sales, :force => true, :id => false do |t| 
    t.integer :product_id, :cross_sales_product_id, :position 
end 

Pero el cross_sales.position campo no se actualiza ...

una idea?

Actualización: Ok el campo 'id' es necesario en el caso de un modelo adicional con la opción has_many: through. Funciona bien ahora

0

En la respuesta aceptada, tenga en cuenta que :order => 'artist_events.position' hace referencia a la tabla artist_events y no al modelo.

Me encontré con este pequeño inconveniente cuando se pasa de una asociación habtm a has_many :through.

Cuestiones relacionadas