Работа с вложенной информацией в контроллере / представлениях - PullRequest
1 голос
/ 08 августа 2010

Это вопрос новичка, но по какой-то причине я не могу найти ответ в другом месте.

Customer has_many orders  
Order has_many order_items

Я нахожусь в customer / show.html.erb и хочу, чтобы мой клиент управлял элементами order_items.

У многих заказов есть много элементов order_items, и я хочу найти ВСЕ из этих элементов order_items, чтобы найти такие, которые читают == false.

#controller
@customer = Customer.find(params[:id])
@orders = @customer.orders

@ order_items = @ orders.order_items не работает. Учитывая, что у меня есть несколько элементов в @orders, как я могу собрать все элементы order_items, принадлежащие @orders?

=== РЕДАКТИРОВАТЬ ===

Вся моя структура базы данных представляет собой большую сложную группу таблиц, и мне нужно пройти по этому дереву для этого конкретного представления.

customer has_many orders
orders has_many order_items
order_items belongs_to category

Как, например, найти номер элемента order_items моего клиента, который относится к категории X?

Последний вопрос: почему не работает @ orders.find_all_by_x (...)?

Ответы [ 2 ]

0 голосов
/ 08 августа 2010

1) Показать все OrderItems для клиента

Вы можете добавить отношение под названием "order_items" для своего клиента следующим образом:

has_many :order_items, :through => :orders

Затем вы можете сделать:

customer = Customer.find(:first)
order_items = customer.order_items

Чтобы найти все непрочитанные OrderItems (где read == false), вы можете добавить named_scope к своему OrderItem:

named_scope :unread, :conditions => {:read => false}

затем вы можете найти все непрочитанные OrderItems для одного клиента с помощью:

customer.order_items.unread

2) Показать все элементы OrderItem клиента, принадлежащего к данной категории

И снова именованная область действия в OrderItem (я полагаю, OrderItem принадлежит_ к категории):

named_scope :in_category, lambda { |name|
  {:conditions => {:categories => {:name => name}}, :include => :category}
}

Два примечания:

  1. Вы должны включить: категорию в условие

  2. даже если она принадлежит_категории: категория (единственное), вы должныиспользование: категории (множественное число).Это потому, что: include добавляет таблицу во множественное число.(Я не знаю, почему это так, и для меня это похоже на намек на то, что это не лучшее решение.)

Последний вопрос: почему нет@ orders.find_all_by_x (...) работает?

Это работает, как и ожидалось для меня.Какое сообщение об ошибке вы получаете?

0 голосов
/ 08 августа 2010

Привет @orders = @customer.orders предоставляет вам коллекцию объектов ActiveRecord. Вы не можете вызывать методы объекта в этой коллекции. Вы должны использовать each итератор

#controller
@customer = Customer.find(params[:id])
@orders = @customer.orders
list = Array.new()
@orders.each do |order|
  //some your action(something like order.order_items)
  //you may add some condition here
  order.order_items.each do |item|  
    list << item
  end
end

. Теперь ищите, я не уверен в * 1006.* но это может работать

OrderItem.find(:all,:conditions => {:category_id => "1"} ).count //if you know category id

или

OrderItem.all :joins => :categories, :conditions => {:categories => {:name => "X"}} //name is column in your table which holds category name

и последнее

Для каждого поля (также известного как атрибут), которое вы определяете в своей таблице,Active Record предоставляет метод поиска.Если у вас есть поле с именем name в вашей модели клиента, например, вы бесплатно получаете find_by_name и find_all_by_name от Active Record.Если у вас также есть заблокированное поле в модели клиента, вы также получаете find_by_locked и find_all_by_locked.

Вы не можете позвонить @orders.find_all_by_x(...), но вы можете позвонить Category.find_all_by_name("X")

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...