Rails HABTM читает уникальные записи

Вот что у меня есть.

client has_many branches

branch has_many projects

project has_and_belongs_to_many announcements

Есть ли более простой способ найти объявления, предоставленные клиенту?

Мне нужна уникальная коллекция объявлений.


person AMIT    schedule 28.12.2010    source источник


Ответы (3)


Если у Клиента может быть несколько Объявлений, но Объявление может принадлежать только одному Клиенту, используйте:

Client:

has_many :announcements

Announcement:

belongs_to :client

Это удерживает его в ActiveRecord. Вы можете найти объявления для данного клиента с помощью нескольких быстрых вызовов методов. Прокрутите вниз до «Модели присоединения ассоциаций» для примеров: http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html

person elithrar    schedule 29.12.2010

Почему бы не создать таблицу соединений для обработки отношений «многие ко многим» между моделями «Клиент» и «Объявление»? Что-то типа:

Client:

has_many :announcements, :through => :client_announcements

Announcement:

has_many :clients, :through => :client_announcements

ClientAnnouncements:

belongs_to :client
belongs_to :project

Затем вы можете настроить объект для поиска объявлений, прикрепленных к определенному идентификатору клиента, или наоборот.

PS: ответ может быть не исчерпывающим, я не являюсь родным разработчиком Rails — проверьте документацию API для примеров того, что я затронул: http://api.rubyonrails.org/classes/ActiveRecord/Ассоциации/ClassMethods.html

person elithrar    schedule 29.12.2010
comment
Я ценю ваш ответ, но я не совсем уверен, что понял :) Объявление не может распространяться на несколько клиентов. У меня уже есть эта штука, работающая, но это включает в себя много рубинового кода и несколько обращений к БД, которые я хотел бы устранить. Я искал что-то в ActiveRecord. Но я думаю, что нет прямого способа сделать это без создания нового отношения. - person AMIT; 29.12.2010

Вы можете создать новое отношение, используя символ uniq на habtm.

has_and_belongs_to_many :uniq_announcements, :source=>:announcements, :uniq=>true

или просто позвоните uniq!

project.announcements.uniq
person dombesz    schedule 30.12.2010