Pregunta

Éste es realmente conseguirme abajo! :(

Estoy tratando de hacer una forma anidada modelo para mi modelo de usuario con la lista pulsando en ella donde múltiples tiendas pueden ser activada o desactivada para administrar los almacenes a través del modelo de personal.

class Staffing < ActiveRecord::Base
  # Associations
  belongs_to :user
  belongs_to :staffable, :polymorphic => true
  belongs_to :store,     :class_name => "Store",
                         :foreign_key => "staffable_id"
end

class User < ActiveRecord::Base
  # Includes
  acts_as_authentic

  # Associations
  has_many :staffings, :dependent => :destroy
  has_many :stores, :through => :staffings

  # Nested Attributes
  accepts_nested_attributes_for :staffings, :allow_destroy => true
end

class Store < ActiveRecord::Base
  # Associations
  has_many :staffings, :as => :staffable, :dependent => :destroy
  has_many :users, :through => :staffings
end


# Users Controller
def create
  @user = User.new(params[:user])
  flash.now[:notice] = "#{@user.name} was successfully created." if @user.save
  respond_with @user
end


def update
  @user = User.find(params[:id])
  params[:user][:store_ids] ||= []
  @user.update_attributes(params[:user])
  flash.now[:notice] = "#{@user.name} was successfully updated."
  respond_with @user
end

A los efectos a la mano la otra asociación staffable puede ser ignorada. Es un modelo similar que con el tiempo que me gustaría administrar junto Store pero primero que del primero ya que estoy tan confundido como es.

# User Form
- for store in Store.all
  %p
    = check_box_tag "user[store_ids][]", store.id, @user.stores.include?(store)
    = store.nickname

Envía mis params lo largo como tal:

{"utf8"=>"✓",
 "authenticity_token"=>"blub-blub-blub=",
 "user"=>{"login"=>"hey.buddy",
 "email"=>"test@hey.net",
 "role"=>"admin",
 "hq"=>"1",
 "password"=>"[FILTERED]",
 "password_confirmation"=>"[FILTERED]",
 "store_ids"=>["3",
 "4"]}}

Y luego ERROR!

Mysql2::Error: Column 'staffable_type' cannot be null: INSERT INTO `staffings` (`created_at`, `staffable_id`, `staffable_type`, `updated_at`, `user_id`) VALUES ('2010-11-17 00:30:24', 3, NULL, '2010-11-17 00:30:24', 102)

Yo sé que tengo que construir staffable_type como 'tienda', pero he estado tratando durante todo el día - ¿cuál es el truco

?

Tengo la staffable_type (e id) fijados a las columnas:. Null => false, pero eso no puede ser la causa de esto como esto tiene que ser enderezadas en el controlador antes de llegar a la base de datos de todos modos

¿Por qué el siguiente no funciona en mi acción de crear:

@user.staffings.each do |s|
  s.staffable_type = 'Store'
end

o

@user.store_ids.each do |i|
  s = @user.staffings.build
  s.staffable_type = 'Store'
  s.staffable_id = i
end

Si ha intentado muchas cosas similares a las anteriores en vano. Cualquier ayuda sería muy apreciada de forma masiva.

Gracias por su tiempo!

¿Fue útil?

Solución

Está bien que pensé que éste hacia fuera. Estoy respondiendo aquí para que pueda ayudar a alguien con suerte algún día, pero el problema era una supervisión básica sobre la diferencia entre Tiene muchos a través y tiene y pertenece a numerosas asociaciones.

Si desea manejar casillas o listas de selección múltiple en una cuenta con muchos través, no hay método es '' _ids generado para usted por la asociación y que necesita para escribir uno por sí mismo.

artículo

Véase Paul Barry aquí: http://paulbarry.com/articles/2007/10/24/has_many -a través de-casillas de verificación

polimórfica cosas puede ser complicado, pero si usted está realmente bien pegado tal vez tomar un paso atrás y asegúrese de que no es algo aún más básico que ha de jugar que up-- trabajado para mí!

A continuación se muestra el código modificado del blog de Pablo sobre la manera de manejar esto si usted está tratando con un polimórfica tiene muchos a través de (básicamente sólo tiene que utilizar el hash atributos y escribir su atributo polymorphic_type):

attr_accessor :store_ids
after_save :update_stores

#after_save callback to handle group_ids
def update_stores
  unless store_ids.nil?
    self.staffings.each do |staffing|
      staffing.destroy unless store_ids.include?(staffing.staffable_id.to_s)
      store_ids.delete(staffing.staffable_id.to_s)
    end 
    store_ids.each do |s|
      self.staffings.create(attributes = {:staffable_id => s, :staffable_type => 'Store'}) unless s.blank?
    end
    reload
    self.store_ids = nil
  end
end 
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top