A través de los carriles has_many polimórficos Las casillas de verificación
-
25-09-2019 - |
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!
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ículoVé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