2008-11-11 41 views
25

Tôi có một vòng lặp (cho mục trong @dataset) và tôi muốn, trong mỗi lần lặp lại, để lấy dữ liệu khác nhau từ một bảng khác và thực hiện một số thao tác sẽ được in Theo quan điểm. Tôi không thể lấy dữ liệu này từ tập dữ liệu được sử dụng trong vòng lặp.Đường ray: nhận dữ liệu từ bảng cho mỗi lần lặp của vòng lặp

Làm cách nào tôi có thể thực hiện việc này theo MVC? Tôi có thể đặt mã vào vòng lặp, theo quan điểm, nhưng tôi nghĩ nó thật khủng khiếp.

Tôi có phải sử dụng trình trợ giúp để thực hiện việc này hay không và gọi hàm từ chế độ xem?

Cảm ơn bạn trước,

- ARemesal

Trả lời

42

Nếu bạn có một bảng và muốn nhận dữ liệu từ một bảng khác, thông thường đây là trong trường hợp quan hệ has_many. Ví dụ: chúng tôi có @people (mô hình Person) và mỗi người has_many địa chỉ (Address mô hình). Trong những trường hợp đó, điều tốt nhất cần làm là:

# Controller 
@people = Person.find(:all, :include => :addresses) 
... 

# View 
@people.each do |p| 
    p.addresses.each do |address| 
    ... 

Nếu dữ liệu của bạn không chỉ là bảng cơ sở dữ liệu bình thường (có thể bạn lấy nó từ dịch vụ web), thì tốt nhất là xây dựng tất cả dữ liệu trong bộ điều khiển trước thời hạn, sau đó truyền dữ liệu đó cho chế độ xem. Một cái gì đó như thế này

# Controller 
@people = Person.find(:all) 
@people.each do |p| 
    # attach loaded data to the person object in controller 
    p.addresses = Address.load_from_somewhere_by_name(p.name) 
... 

Bằng cách này các mã nhìn vẫn sạch sẽ, như thế này:

# View 
@people.each do |p| 
    p.addresses.each do |address| 
    ... 
+0

Đối với những người trong nhà của tôi, tôi nghĩ đây là giải pháp tốt nhất. Cảm ơn bạn Orion cho một mẹo những gì đã cho tôi rất nhiều ý tưởng mới :) – ARemesal

1

Nó là khá khó có thể nói giải pháp về tốt nhất cho vấn đề của bạn mà không cần thông tin chi tiết về dữ liệu và các mối quan hệ giữa các mô hình của bạn (bảng). Ý tưởng chung là tiếp theo: giữ quan điểm của bạn ngu ngốc. Nhận tất cả dữ liệu cần thiết để hiển thị chế độ xem bên trong hành động bộ điều khiển của bạn. Thực hiện tất cả các thay đổi và tính toán trong cùng một hành động. Sau đó, trong chế độ xem, hãy sử dụng dữ liệu này.

btw, nếu bạn đang nói về vấn đề N + 1 thì hãy đọc thêm về tham số ActiveRecord 'bao gồm' và 'tham gia' tham gia.

0
  • Giữ tất cả các logic về mặt hàng @dataset của bạn bên trong hành động điều khiển
  • Sử dụng phương pháp trong mô hình của bạn cho sự tương tác với mô hình khác các đối tượng bạn cần
  • Bạn chỉ nên để chỉ @dataset cho tầm nhìn của bạn mà bạn có thể hiển thị một phần.

Bạn cần giải thích thêm về tình huống của mình để biết thêm bất kỳ câu trả lời nào về điều đó. Bạn cần tương tác với loại hoạt động nào và các mô hình khác? Nếu bạn đăng các liên kết mô hình của mình, tôi chắc chắn chúng tôi có thể thực sự làm cho bạn vuông góc.

Chúc may mắn!

1

Nếu tôi là bạn, tôi sẽ tạo một lớp riêng biệt đóng gói tập dữ liệu và chứa tất cả logic liên quan đến việc xử lý các mục nhập tập dữ liệu. Lớp này có thể lặp lại (trả lời từng lớp). Sau đó, tôi sẽ chuyển một thể hiện của lớp này đến khung nhìn và chỉ sử dụng các phương thức của nó ở đó.

+0

Tôi nghĩ rằng đó là một giải pháp tốt và đẹp, nhưng nó quá phức tạp cho nhu cầu của tôi trong trường hợp này. Tôi sẽ chú thích nó trong tương lai :) – ARemesal

1
Person(id, name, other fields...) 
Event(id, title, ...) 
Date(id, date, time, event_id, ...) 
Disponibility(id, percent, date_id, person_id, ...) 

Tất nhiên, tất cả các mối quan hệ được định nghĩa trong mô hình.

Tôi có chế độ xem hiển thị tất cả các ngày cho một sự kiện, thật dễ dàng. Nhưng tôi muốn, cho mỗi ngày, để in dữ liệu cho tất cả những người có sẵn cho ngày đó. Theo quan điểm của tôi, quên mẫu thiết kế MVC, tôi có thể mã hóa một cái gì đó như thế này:

<% for date in @Dates 
    available = Disponibility.find_by_date_id(date.id) 
    for item in available 
    guy = Person.find_by_id(item.person_id) 
%> 

ngày và mọi người sẵn Render ...

Tôi muốn tránh điều này trong giao diện. Tôi nghĩ rằng câu trả lời của Orion Edwards là gần nhất cho những gì tôi cần, nhưng, trong ví dụ đó, địa chỉ là một trường trống cho bảng Person? Hoặc làm thế nào tôi có thể nối thêm một thuộc tính mới vào lớp Person?

Mặc dù, tôi có thiếu bất kỳ thủ thuật SQL nào để thực hiện việc này không?

Các vấn đề liên quan