【问题标题】:Rails Has Many Through Polymorphic CheckboxesRails 有很多通过多态的复选框
【发布时间】:2011-05-11 04:12:42
【问题描述】:

这个真的让我失望了! :(

我正在尝试为我的用户模型制作一个嵌套模型表单,其中包含一个复选框列表,可以选中或取消选中多个商店以通过模型人员配置管理商店。

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

出于手头的目的,可以忽略其他人员关联。这是一个类似的模型,我最终想与 Store 一起管理,但第一件事是第一件事,因为我被难住了。

# 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)

我知道我必须将 staffable_type 构建为“Store”,但我整天都在尝试——有什么诀窍?

我确实将 staffable_type(和 id)列设置为 :null => false 但这不是造成这种情况的原因,因为无论如何都需要在控制器中理顺这一点,然后才能访问 DB。

为什么以下内容在我的创建操作中不起作用:

@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

如果尝试了许多与上述类似的事情都无济于事。任何帮助将不胜感激。

感谢您的宝贵时间!

【问题讨论】:

    标签: ruby-on-rails forms checkbox has-many-through has-many-polymorphs


    【解决方案1】:

    好的,我想通了。我在这里回答,希望有朝一日可以帮助某人,但问题是基本疏忽了 Has Many Through 和 Has And Belongs To Many Associations 之间的区别。

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

    在此处查看 Paul Barry 的文章: http://paulbarry.com/articles/2007/10/24/has_many-through-checkboxes

    多态的东西可能很复杂,但如果你真的被卡住了,不妨退后一步,确保不是更基本的东西让你搞砸了——对我有用!

    下面是从 Paul 的博客修改的代码,说明如果您正在处理多态有很多通过(基本上您只需要使用属性哈希并编写您的 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 
    

    【讨论】:

      猜你喜欢
      • 2016-04-01
      • 2015-09-17
      • 2021-11-16
      • 2023-04-09
      • 2012-03-17
      • 2017-04-25
      • 1970-01-01
      • 2017-09-03
      • 1970-01-01
      相关资源
      最近更新 更多