Vì vậy, nghĩ rằng tôi đã làm việc này đêm qua, canve tuyên thệ nó. Bây giờ nó không có tác dụng, và tôi hình dung thời gian để yêu cầu giúp đỡ.ruby trên đường ray thuộc tính động lĩnh vực từ DB sử dụng các vấn đề method_missing
Im lĩnh vực năng động quyết định trong cơ sở dữ liệu, phong cách EAV bán, và cho phép chỉ nêu ngay bây giờ tôi không quan tâm để nghe ý kiến của bạn về việc liệu EAV là một ý tưởng tốt hay không :)
Anyways Im làm nó một chút khác với Ive thực hiện trong quá khứ, về cơ bản khi một thuộc tính (hoặc field) được thêm vào, tôi tạo một cột thêm vào một bảng thuộc tính cụ thể di chuyển và chạy nó (hoặc loại bỏ nó) - BẤT KWAY, bởi vì có một lớp thể loại ngồi ở giữa là mối quan hệ trực tiếp nơi tất cả các thuộc tính được xác định, tôi không thể sử dụng tên thuộc tính thực tế làm tên cột, vì thuộc tính là danh mục cụ thể.
Vì vậy, nếu nó giúp bạn hình dung
Entity
belongs_to :category
Category
has_many :entities
EntityAttribute
belongs_to :category
EntityAttributeValue
belongs_to :entity_attribute
belongs_to :entity
Và EAV bảng kéo dài theo chiều ngang như các thuộc tính mới được tạo ra, với các cột dán nhãn attribute_1 attribute_2, có chứa các giá trị cho rằng thực thể cụ thể.
Anyways - Tôi cố gắng để thực hiện các phương pháp năng động trên mô hình tổ chức nào, vì vậy tôi có thể gọi @ entity.actual_attribute_name, chứ không phải là @ entity.entity_attribute_value.field_5
Đây là mã tôi nghĩ đang làm việc - -
def method_missing(method, *args)
return if self.project_category.blank?
puts "Sorry, I don't have #{method}, let me try to find a dynamic one."
puts "let me try to find a dynamic one"
keys = self.project_category.dynamic_fields.collect {|o| o.name.to_sym }
if keys.include?(method)
field = self.project_category.dynamic_fields.select { |field| field.name.to_sym == method.to_sym && field.project_category.id == self.project_category.id }.first
fields = self.project_category.dynamic_field_values.select {|field| field.name.to_sym == method }
self.project_category_field_value.send("field_#{field.id}".to_sym, *args)
end
end
sau đó, ngày hôm nay khi tôi quay trở lại mã, tôi nhận ra mặc dù tôi có thể thiết lập các thuộc tính trong đường ray giao diện điều khiển, và nó sẽ trả lại trường đã chính xác, khi tôi lưu bản ghi, các EntityAttributeValue đã không được cập nhật (được đại diện như self.project_category_field_value, ở trên.)
Vì vậy, sau khi nhìn sâu hơn, có vẻ như tôi chỉ cần thêm một lời gọi before_update hoặc before_save để lưu thuộc tính theo cách thủ công và đó là nơi tôi nhận thấy, trong hàm gọi lại, nó sẽ chạy gọi lại method_missing, như thể đối tượng được nhân bản (và đối tượng mới là bản sao của đối tượng gốc), hoặc một cái gì đó, Im không hoàn toàn chắc chắn. Nhưng tại một nơi nào đó trong quá trình lưu hoặc trước đây, thuộc tính của tôi biến mất thành lãng quên. Vì vậy, tôi đoán tôi đã trả lời một nửa câu hỏi của chính mình sau khi gõ nó ra, tôi cần phải đặt một biến cá thể và kiểm tra xem nó có tồn tại khi bắt đầu phương thức method_missing của tôi (đúng không?) Có lẽ đó không phải là những gì xảy ra tôi không biết, nhưng Im cũng yêu cầu nếu có một cách tốt hơn để làm những gì tôi đang cố gắng để làm. Và nếu sử dụng method_missing là một ý tưởng tồi, hãy giải thích tại sao, khi đi qua các bài viết liên quan đến phương pháp, tôi nghe thấy một số người phá hỏng nó, nhưng không một trong số những người đó băn khoăn đưa ra lời giải thích hợp lý. .
Xin cảm ơn trước.
cảm ơn vì đã trả lời, tôi không thể làm cho nó hoạt động một mình thông qua mã ở trên nhưng tôi đã sử dụng một số trong việc tái cấu trúc để tôi chấp nhận câu trả lời – thrice801