5

Điều này thực sự khiến tôi thất vọng! :(Đường ray có nhiều thông qua hộp kiểm đa hình

Tôi đang cố gắng để thực hiện một hình thức mô hình lồng nhau cho mô hình tài khoản của tôi với một danh sách hộp kiểm ở trong đó mà nhiều cửa hàng có thể được kiểm tra hoặc không được kiểm soát để quản lý các cửa hàng thông qua mô hình nhân sự.

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 

Đối mục đích trong tầm tay hiệp hội staffable khác có thể được bỏ qua. đó là một mô hình tương tự mà tôi cuối cùng muốn muốn quản trị cùng với cửa hàng nhưng trước tiên điều đầu tiên kể từ khi tôi đang rất bối rối vì nó là.

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

Gửi params của tôi như vậy:

{"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"]}} 

Và sau đó L ERI!

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) 

Tôi biết tôi phải xây dựng staffable_type là 'Store' nhưng tôi đã cố gắng cả ngày - mẹo là gì?

Tôi có các cột staffable_type (và id) được đặt thành: null => false nhưng không thể là nguyên nhân của việc này vì điều này cần được thẳng ra trong bộ điều khiển trước khi nhấn DB.

Tại sao dưới đây không làm việc trong hành động tạo của tôi:

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

hay:

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

Nếu đã cố gắng rất nhiều điều tương tự như trên không có kết quả. Bất kỳ trợ giúp nào cũng sẽ được đánh giá cao.

Cảm ơn bạn đã dành thời gian!

Trả lời

4

OK Tôi đã tìm ra điều này. Tôi đang trả lời ở đây vì vậy tôi hy vọng có thể giúp một ai đó một ngày nào đó, nhưng vấn đề là một sự giám sát cơ bản về sự khác biệt giữa Có Nhiều Thông qua và Có Và Thuộc Nhiều Hiệp hội.

Bạn nếu bạn muốn xử lý hộp kiểm hoặc danh sách đa lựa chọn trong Có nhiều thông qua, không có phương pháp '_ids' được tạo ra cho bạn bởi hiệp hội và bạn cần phải viết một cho chính mình. Điều

Xem Paul Barry ở đây: http://paulbarry.com/articles/2007/10/24/has_many-through-checkboxes

thứ đa hình có thể phức tạp, nhưng nếu bạn đang gặp khó khăn thực sự tốt có thể lùi lại một bước và chắc chắn rằng nó không phải là một cái gì đó thậm chí cơ bản hơn đó là rối tung bạn up-- đã làm cho tôi!

Dưới đây là mã đổi từ blog của Thánh Phaolô về cách xử lý này nếu bạn đang làm việc với một đa hình có nhiều qua (về cơ bản bạn chỉ cần sử dụng các thuộc tính băm và viết thuộc tính polymorphic_type của bạn):

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 
Các vấn đề liên quan