Рельсы - Соединение 4 столов - PullRequest
0 голосов
/ 25 января 2012

Допустим, у нас есть 4 таблицы

Client has many Campaign
Campaign has many Adgroup
Adgroup has many Ad
Ad

Отношения такие же, один ко многим. Допустим, мы знали Ad.id и хотим получить Client.id от этого Ad.id.

Может ли кто-нибудь дать элегантное решение (под элегантностью я подразумеваю без написания SQL-оператора, вместо этого использовать процедуру активных записей)?

Ответы [ 3 ]

2 голосов
/ 25 января 2012

Убедитесь, что Ad belongs_to является Группой объявлений и имеет ссылку на нее в своей структуре БД! Группы объявлений должны belongs_to Кампании и так далее, до самого конца. Помните, что чувак с belongs_to - это тот, кому нужно хранить в своей таблице базы данных ссылку на парня, который has_one его, а не наоборот!

Если ресурсы созданы для начала нормально, вы сможете позвонить на @ad.adgroup.campaign.client.id и получить идентификатор определенного объявления (скажем, по @ad = Ad.find(some_id)).

Надеюсь, это поможет!

1 голос
/ 25 января 2012

При использовании ассоциаций Rails вы должны не забыть указать belongs_to для другой стороны отношения, поэтому объявление, скорее всего, будет has_one Adgroup, и так далее, и так далее по цепочке. Как только вы свяжете ассоциации, вы можете использовать ActiveRecord для цепочки методов этих моделей, начиная снизу вверх и доходя до вершины иерархии. Таким образом, вы начинаете с рекламы и цепочки, как:

@ad = Ad.find(an_id_or_name_or_whatever).Adgroup.Campaign.Client.id

Глядя на вышесказанное, вы можете связать Adgroup с Ad благодаря ассоциативным отношениям, которые дают вам доступ к методам этой родительской модели вплоть до модели Client, из которой .id - это метод, и вы можете вызывать его.

Взгляните на некоторые основы ассоциации с Rails здесь:

http://guides.rubyonrails.org/association_basics.html

0 голосов
/ 03 сентября 2013

Сначала убедитесь, что ваши отношения настроены следующим образом:

class Ad < ActiveRecord::Base
  belongs_to :ad_group, inverse_of: :ads
end

class AdGroup < ActiveRecord::Base
  belongs_to :campaign, inverse_of: :ad_groups
  has_many :ads, inverse_of :ad_group
end

class Campaign < ActiveRecord::Base
  belongs_to :client, inverse_of: :campaigns
  has_many :ad_groups, inverse_of :campaign
end

class Client < ActiveRecord::Base
  has_many :campaigns, inverse_of :client
end

Используйте соединения и собирайте, если вам нужен только идентификатор клиента и эффективный SQL:

Client.joins(campaigns: {ad_groups: :ad}).where(
  ads: { id: some_id }).pluck('clients.id').first

Если вам нужен весь клиент и эффективный SQL, просто:

Client.joins(campaigns: {ad_groups: :ad}).where(ads: { id: some_id }).first
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...