Tóm tắt/lỗi
Tôi nhận được lỗi này ở nhiều nơi khác nhau trong ứng dụng của tôi:AssociationTypeMismatch cho cùng một mô hình
ActiveRecord::AssociationTypeMismatch in Settings::CompaniesController#show
Company(#70257861502120) expected, got Company(#70257861787700)
activerecord (3.2.11) lib/active_record/associations/association.rb:204:in `raise_on_type_mismatch'
activerecord (3.2.11) lib/active_record/associations/belongs_to_association.rb:6:in `replace'
activerecord (3.2.11) lib/active_record/associations/singular_association.rb:17:in `writer'
activerecord (3.2.11) lib/active_record/associations/builder/association.rb:51:in `block in define_writers'
activerecord (3.2.11) lib/active_record/attribute_assignment.rb:85:in `block in assign_attributes'
activerecord (3.2.11) lib/active_record/attribute_assignment.rb:78:in `each'
activerecord (3.2.11) lib/active_record/attribute_assignment.rb:78:in `assign_attributes'
activerecord (3.2.11) lib/active_record/base.rb:497:in `initialize'
app/controllers/settings/companies_controller.rb:4:in `new'
app/controllers/settings/companies_controller.rb:4:in `show'
khiển
Bộ điều khiển trông như thế này, nhưng vấn đề có thể xảy ra tại bất kỳ thời điểm nào mà mô hình Công ty được sử dụng để lưu hoặc cập nhật một mô hình khác:
class Settings::CompaniesController < SettingsController
def show
@company = current_user.company
@classification = Classification.new(company: @company)
end
def update
end
end
Sự kiện/quan sát
Một số sự kiện và quan sát:
- Vấn đề xảy ra một cách ngẫu nhiên, nhưng thông thường sau khi máy chủ phát triển đã được chạy trong một thời gian.
- Sự cố không xảy ra trong quá trình sản xuất.
- Sự cố xảy ra ngay cả khi tôi hoàn toàn không thay đổi đối với mô hình
Company
. - Sự cố được giải quyết bằng cách khởi động lại máy chủ.
Lý thuyết
Theo như tôi hiểu được điều này là do nạp năng động của các lớp học.
Bằng cách nào đó lớp Công ty đang nhận mã định danh lớp mới khi tải lại. Tôi đã nghe những tin đồn về nó là do yêu cầu cẩu thả. Tôi không yêu cầu của riêng tôi trong mô hình Công ty, nhưng tôi sử dụng active-record-postgres-hstore.
Các mô hình
Đây là mô hình Company
:
class Company < ActiveRecord::Base
serialize :preferences, ActiveRecord::Coders::Hstore
DEFAULT_PREFERENCES = {
require_review: false
}
has_many :users
has_many :challenges
has_many :ideas
has_many :criteria
has_many :classifications
attr_accessible :contact_email, :contact_name, :contact_phone, :email, :logotype_id, :name, :phone, :classifications_attributes, :criteria_attributes, :preferences
accepts_nested_attributes_for :criteria
accepts_nested_attributes_for :classifications
after_create :setup
before_save :set_slug
# Enables us to fetch the data from the preferences hash directly on the instance
# Example:
# company = Company.first
# company.preferences[:foo] = "bar"
# company.foo
# > "bar"
def method_missing(id, *args, &block)
indifferent_prefs = HashWithIndifferentAccess.new(preferences)
indifferent_defaults = HashWithIndifferentAccess.new(DEFAULT_PREFERENCES)
if indifferent_prefs.has_key? id.to_s
indifferent_prefs.fetch(id.to_s)
elsif indifferent_defaults.has_key? id.to_s
indifferent_defaults.fetch(id.to_s)
else
super
end
end
private
def setup
DefaultClassification.find_each do |c|
Classification.create_from_default(c, self)
end
DefaultCriterion.find_each do |c|
Criterion.create_from_default(c, self)
end
end
def set_slug
self.slug = self.name.parameterize
end
end
Mô hình Phân loại:
class Classification < ActiveRecord::Base
attr_accessible :description, :name, :company, :company_id
has_many :ideas
belongs_to :company
def to_s
name
end
end
Câu hỏi thực tế
Tôi muốn được thực sự muốn biết lý do tại sao vấn đề này xảy ra và nếu nó có thể tránh được bằng cách nào đó.
Tôi biết ý nghĩa của ngoại lệ. Tôi muốn biết cách tránh nó.
Đặc biệt, tôi muốn biết nếu tôi gây ra vấn đề bằng cách nào đó hoặc nếu nó là đá quý, và trong trường hợp đó nếu tôi có thể giúp sửa chữa đá quý bằng bất kỳ cách nào.
Cảm ơn bạn trước vì bất kỳ câu trả lời nào.
'ActiveRecord :: AssociationTypeMismatch' xảy ra' khi đối tượng được gán cho liên kết có loại không đúng'. Trong trường hợp của bạn, bạn đang 'liên kết công ty để phân loại'. Đó là chính xác khi bạn có liên kết được xác định giữa những người. Nhưng bạn không lưu đối tượng trong hành động của bạn. – codeit
Xem phần này: https://github.com/rails/rails/blob/master/activerecord/lib/active_record/errors.rb – codeit
Có, tôi biết ý nghĩa của ngoại lệ. Hiệp hội được xác định theo cả hai cách, sẽ thêm chỉnh sửa để phản ánh điều này. Về câu này: "Nhưng bạn không lưu đối tượng trong hành động của bạn". Tôi không cứu nó vì tôi không muốn cứu nó. Tôi đang chuẩn bị một đối tượng Phân loại cho một biểu mẫu. – Jesper