Rails - логика для поиска информации от: has_many: through required! - PullRequest
1 голос
/ 22 мая 2010

У меня есть 3 соответствующие таблицы. Пользователь, Заказы и Доступные для просмотра

Идея состоит в том, что у каждого пользователя есть много заказов, но в то же время каждый пользователь может просматривать конкретные другие заказы, принадлежащие другим пользователям. Таким образом, Viewables имеет атрибуты user_id и order_id.

Заказы имеют :has_many :Users, :through => :viewables

Можно ли сделать поиск через вид Ордена? Так что-то вроде

@ viewable_orders = Orders.find (: все,: условия => ["Viewable.user_id =?", 1])

Чтобы получить список заказов, которые можно просмотреть по user_id = 1. (Это не работает, иначе я не буду спрашивать. :() Идея в том, что я могу сделать что-то вроде боковой панели, где текущий пользователь (вошедший в систему) может просматривать список заказов других людей, которые он может просматривать. Например

Три других пользователя, у которых есть какие-то ордера, которые он может просматривать, должны в конечном итоге отображаться так:

  1. Джек (2)
    • Базовый заказ (registry_id: 1)
    • Новый заказ (registry_id: 29)
  2. Эми (4)
    • Короткий заказ (registry_id: 12)
  3. Джилл (5)
    • Заказ оборудования (14)
    • Розовый Заказ (17)
    • Заказ ПО (76)

(в скобках указаны соответствующие user_id или registry_id)

Таким образом, чтобы найти список всех заказов, которые может найти текущий пользователь (при условии, что user_id текущего пользователя равен 1), можно найти, выполнив

@viewable_orders = Viewable.find(:all, :conditions => ["user_id=?", 1])

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

+ Jill's Hardware Order
+ Jill's Pink Order
+ Amy's Short Order
+ etc

Но это уродливо для длинных списков.

Спасибо!

1 Ответ

1 голос
/ 22 мая 2010

Вы должны настроить has_many: через ассоциацию не только по модели заказов, но и по пользователям. Поскольку у вас уже есть has_many :orders ассоциация для пользователя, вы можете дать вашей ассоциации другое имя, например, viewable_orders:

class User < ActiveRecord::Base
  has_many :orders
  has_many :viewables
  has_many :viewable_orders, :through => :viewables, :source => :order
end

class Viewable < ActiveRecord::Base
  belongs_to :user
  belongs_to :order
end

class Order < ActiveRecord::Base
  belongs_to :user
  has_many :viewables
  has_many :users, :through => :viewables
end

И затем использовать можно использовать user.viewable_orders, чтобы получить все заказы, которые конкретный пользователь может просматривать

...