5

这一个真的让我失望! :(Rails有许多通过多态复选框

我试图做一个嵌套的模型形式为我在里面有一个复选框列表,其中多个商店,可以选中或取消选中通过模型人员配备来管理存储的用户模型。

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 

对于其他staffable协会可以忽略不计的目的在眼前。这是一个类似的模型,我最终想要第一旁边商店,但第一件事的管理,因为我很为难,因为它是。

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

发送我的PARAMS沿着这样的:

{"utf8"=>"✓", 
"authenticity_token"=>"blub-blub-blub=", 
"user"=>{"login"=>"hey.buddy", 
"email"=>"[email protected]", 
"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) 

我知道我必须打造出staffable_type为“商店”,但我已经了一整天 - 有什么诀窍?

我确实将staffable_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 

如果一直试图与上述类似无济于事很多东西。任何帮助将大规模赞赏。

谢谢你的时间!

回答

4

好吧我想出了这一个。我在这里回答,所以我希望有一天能够帮助别人,但问题是对许多通过并拥有和属于许多社团的区别的基本监督。

如果您想处理Has Many Through中的复选框或多选列表,那么关联就不会为您生成'_ids'方法,您需要为自己编写一个'_ids'方法。

看到了保罗·巴里的文章在这里: http://paulbarry.com/articles/2007/10/24/has_many-through-checkboxes

多态的东西可能会很复杂,但如果你坚持真正的好,也许退一步,并确保它不是一些更基本的多数民众赞成搞乱你up--为我工作!

下面是保罗对如何处理这个,如果你正在处理一个多态博客修改的代码有许多通过(基本上你只需要使用的属性哈希,写你的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