Rails имеет много через полиморфные флажки
-
25-09-2019 - |
Вопрос
Это действительно падает! :(
Я пытаюсь сделать вложенную форму модели для моей модели пользователей с помощью списка флажков в нем, где можно проверить несколько магазинов, чтобы администрировать магазины с помощью модели персонала.
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
Для целей под рукой другая сотрудника может быть проигнорирована. Это похожая модель, которую я в конечном итоге хочу управлять наряду с магазином, но сначала сначала, так как я так отмарился, как это.
# User Form
- for store in Store.all
%p
= check_box_tag "user[store_ids][]", store.id, @user.stores.include?(store)
= store.nickname
Отправляет моими словами как таковые:
{"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"]}}
А потом ошибка!
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)
Я знаю, что я должен построить PALFALE_TYPE как «Store», но я пытался весь день - какой трюк?
У меня есть столбцы PALFABLE_TYPE (и ID), установленные на: null => false, но это не может быть причиной этого, поскольку это необходимо выпрямлять в контроллере, прежде чем воспользоваться БД.
Почему ниже не работает в моем создании действий:
@user.staffings.each do |s|
s.staffable_type = 'Store'
end
или:
@user.store_ids.each do |i|
s = @user.staffings.build
s.staffable_type = 'Store'
s.staffable_id = i
end
Если пробовать многое, похожее на вышесказанное безрезультатно. Любая помощь была бы массово оценена.
Спасибо за ваше время!
Решение
Хорошо, я полагал этот один. Я отвечаю здесь, так что я могу, надеюсь, поможет кому-нибудь когда-нибудь когда-нибудь когда-нибудь, но проблема была основным надзором по поводу разницы между многое и имеет и принадлежит многим ассоциациям.
Если вы хотите обрабатывать флажки или многосекретные списки у A, есть много через, нет метода «_ids», созданный для вас ассоциацией, и вам нужно написать для себя.
Статью Пол Барри здесь:http://paulbarry.com/articles/2007/10/24/has_many-through-checkboxes.
Полиморфные вещи могут быть сложными, но если вы застряли настоящие хорошие, возможно, сделайте шаг назад и убедитесь, что это не что-то еще более простое, что беспокоит вас - работал для меня!
Ниже приведен код, модифицированный из блога Павла, о том, как справиться с этим, если вы имеете дело с полиморфным, много через (в основном вам просто нужно использовать атрибуты Hash и записывать свой атрибут 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