Tôi có một lớp Item với các thuộc tính sau:
itemId,name,weight,volume,price,required_skills,required_items
.
Vì hai thuộc tính cuối cùng sẽ được đa trị hóa, tôi đã loại bỏ chúng và tạo các lược đồ mới như:
itemID,required_skill
( itemID
là khóa ngoại, itemID and required_skill
là khóa chính.)
Bây giờ, tôi bối rối làm thế nào để tạo / sử dụng bảng mới này. Dưới đây là các tùy chọn xuất hiện trong tâm trí của tôi:
1) Mối quan hệ giữa Item và required_skills là một-nhiều, vì vậy tôi có thể tạo một lớp requiredSkill, thuộc về Item, đối với Item, trong đó lần lượt có n RequestSkills. Sau đó tôi có thể làm Item.get(1).requiredskills
. Điều này nghe có vẻ hợp lý nhất với tôi và cung cấp cho tôi các phương thức và truy vấn như:
sugar.components.create :raw_material => water.name
sugar.components.create :raw_material => sugarcane.name
sugar.components
sugar.components.count
2) Vì required_skills có thể được coi là hằng số (vì chúng giống với quy tắc), tôi có thể đặt chúng vào cơ sở dữ liệu băm hoặc gdbm hoặc bảng sql khác và truy vấn từ đó, mà tôi không thích.
Câu hỏi của tôi là: có cái gì đó giống như bảng modelless trong datamapper, trong đó datamapper chịu trách nhiệm từ việc tạo và tính toàn vẹn của bảng và cho phép tôi truy vấn nó theo cách datamapper, nhưng không yêu cầu một lớp, như tôi có thể làm nó trong sql ?
Tôi đã giải quyết vấn đề của mình bằng cách sử dụng cách đầu tiên: Tôi đã tạo một lớp mới cho mỗi quy trình chuẩn hóa (xuất hiện dưới dạng liên kết một-nhiều ở trên). Tuy nhiên, tôi chưa quen với lập trình hướng đối tượng và tôi không biết liệu việc tạo một lớp mới cho mỗi chuẩn hóa như vậy có phải là cách thông thường để thực hiện trong datamapper hay đúng hơn là hack? Điều này, và liệu có cách nào tốt hơn để làm điều này, là những gì tôi muốn biết.
@JustinC
Đọc lại các Hiệp hội datamapper.org nhiều lần, bây giờ tôi thấy rằng datamapper chắc chắn yêu cầu các lớp riêng biệt để tham gia. Vì vậy, bạn đã trả lời câu hỏi của tôi. Tuy nhiên, kể từ khi Robert Harvey đặt tiền thưởng, tôi cảm thấy có trách nhiệm phải chờ thêm một chút để có phản hồi về một cách năng động.
Mã của bạn phàn nàn với Cannot find the child_model Container for Item in containers
. Tôi đã quản lý để làm cho nó hoạt động với ví dụ thứ hai về liên kết tự giới thiệu như bên dưới (đặt ở đây làm tài liệu tham khảo cho người khác):
class Item
class Link
include DataMapper::Resource
storage_names[:default] = "requirement_links"
belongs_to :require, "Item", :key => true
belongs_to :required, "Item", :key => true
end
include DataMapper::Resource
property :id, Serial
property :name, String, :required => true
has n, :links_to_required_items, "Item::Link", :child_key => [:require_id]
has n, :links_to_requiring_items, "Item::Link", :child_key => [:required_id]
has n, :required_items, self,
:through => :links_to_required_items,
:via => :required
has n, :requiring_items, self,
:through => :links_to_requiring_items,
:via => :require
def require(others)
required_items.concat(Array(others))
save
self
end
def unrequire(others)
links_to_required_items.all(:required => Array(others)).destroy!
reload
self
end
end
Vì vậy, tôi có thể làm:
jelly = Item.get :name => "Jelly"
sugar = Item.get :name => "Sugar"
jelly.require sugar
để yêu cầu các mặt hàng và:
jelly.required_items.each { |i|; puts i.name }
để liệt kê các yêu cầu, đó là thực sự tuyệt vời.
Sau khi đọc câu trả lời của bạn, tôi thấy rằng tôi vẫn chưa bình thường hóa lược đồ cơ sở dữ liệu của mình hơn nữa. Thành thật mà nói, tôi không thấy quan điểm xác định mối quan hệ giữa nguyên liệu thô và sản phẩm là tự tham khảo. Ý tôi là, nếu đó là một chương trình nhỏ, tôi chắc chắn sẽ sử dụng hàm băm {:jelly => ":sugar => 3, :water => 5"}
để phản ánh các mục và số lượng cần thiết, theo nguyên tắc YAGNI. Làm như trong tùy chọn 1 đã cung cấp cho tôi các truy vấn và phương thức đơn giản như các truy vấn được cung cấp bởi hiệp hội tự giới thiệu. (Tuy nhiên, tôi phải thừa nhận rằng nó trông giống một thủ tục được lưu trữ hơn là một cuộc gọi phương thức đến một đối tượng.)
Vì vậy, bạn có thể rất bận tâm để giải thích những lợi ích của việc sử dụng một hiệp hội tự giới thiệu, rất khó hiểu / thực hiện đối với tôi, so với cách tiếp cận đơn giản hơn của tôi? Tôi chưa quen với OOP và tự hỏi liệu tôi có bị hạ thấp không.