Заказ первой модели в ассоциации со второй моделью - PullRequest
2 голосов
/ 09 сентября 2009

Я работаю над своим первым проектом с RoR, и мне нужно создать отношения многие ко многим между двумя моделями, но с возможностью упорядочения объектов первой модели в связи со второй моделью.

Допустим, у меня есть две следующие модели - Покупатель - маршрут

Я хочу назначить много клиентов нескольким маршрутам, но с сохранением порядка этой ассоциации, например,

-Route 1
--Customer 2, position 1
--Customer 1, position 2

-Route 2
--Customer 3, position 1
--Customer 1, position 2

Я думаю, мне нужно использовать для него has_many: through и own_to и создать поле "position" в средней таблице, но как сделать это поле доступным и редактируемым?

Ответы [ 4 ]

3 голосов
/ 10 сентября 2009

Вы можете пойти с :through:

class Route < ActiveRecord::Base
  has_many :bookings
  has_many :routes, :through => bookings
end

class Booking < ActiveRecord::Base
  belongs_to :route
  belongs_to :customer
end

class Customer < ActiveRecord::Base
  has_many :bookings
  has_many :routes, through => :bookings
end

Ваша модель бронирований сохранит дату / позицию, и вы сможете получить к ним доступ с помощью:

c = Customer.first
c.routes(:include => :bookings, :order => "bookings.position")
1 голос
/ 10 сентября 2009
class Customer < ActiveRecord::Base
  has_many :routes, :through => :trips
  ...
end

class Trip < ActiveRecord::Base
  belongs_to :customer
  belongs_to :route
  // has a ordinal called 'seq'
  ...
end

class Route < ActiveRecord::Base
  has_many :customers, :through => :trips
  ...
end

Вы должны иметь доступ к порядковому полю через @ customer.routes [0] .seq Я не проверял это, и мои навыки работы с рельсами слишком скучны, но вы должны понять.

0 голосов
/ 10 сентября 2009

Я хочу отобразить все назначения клиентов для одного маршрута, поэтому запрос, отправленный в базу данных:

SELECT customers. * FROM customers INNER JOIN bookings ON customers .id = bookings .customer_id WHERE ((* bookings .route_id = 1))

, а затем

ВЫБРАТЬ bookings. * ОТ bookings ГДЕ (bookings .customer_id IN (1,2,3))

.. итак, второй запрос не содержит достаточно информации в WHERE calus, потому что он выбирает информацию для всех маршрутов для конкретных клиентов, а не только для конкретных клиентов для конкретного маршрута (id = 1).

.. выполняет ли RoR дополнительную фильтрацию после извлечения этих данных?

кстати. У меня есть: include =>: заказы добавлены в модель маршрута

0 голосов
/ 10 сентября 2009

Правильно. чтобы получить доступ к средней таблице, попробуйте:

c.bookings # this will return the 'middle table' which then you have the access to the positions 
c.bookings.first.position
...