рельсы соединение соединения (рельсы 2.3.5 и ruby ​​1.8.7) - PullRequest
2 голосов
/ 08 июня 2011

У меня есть

data_records, бренды и влиятельные лица

data_records имеют много брендов data_records имеют 1 влияющий

бренды имеют много влияющих через ассоциацию brand_influencers, которая имеет атрибут top (boolean).

вот мои модели:

class DataRecord < ActiveRecord::Base
  belongs_to :influencer
  has_and_belongs_to_many :brands
end

class Brand < ActiveRecord::Base
 has_and_belongs_to_many :data_records
end

class Influencer < ActiveRecord::Base
  has_many :brands_influencers
  has_many :brands, :through => :brands_influencers
end

class BrandsInfluencer < ActiveRecord::Base
  belongs_to :brand
  belongs_to :influencer
end

Я хотел бы сделать один запрос, чтобы получить все data_records для данного бренда, где влиятельные лица входят в число самых влиятельных брендов (top =true).

Мне нужно начать с модели data_record, потому что есть другие динамические запросы, которые можно прикрепить к этому запросу (это типичный экран большого типа фильтра).

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

спасибо Джоэл

Ответы [ 3 ]

4 голосов
/ 30 марта 2012

версия рельсов 2.3.5 это,

DataRecord.find :all, :conditions => ['brands.name = ? AND influencers.top = ?', 'name', true], :joins => {:brands => :influencers}

Я предполагаю, что есть название для бренда, а вы ищете бренд по имени. И вам нужно изменить Brand так:

class Brand < ActiveRecord::Base
    has_and_belongs_to_many :data_records
    has_and_belongs_to_many :influencers
end
0 голосов
/ 27 марта 2012

Вы можете получить join от другого и ссылаться на них в where следующим образом:

DataRecord.joins(:influencers => {:brand_influencers}, :brands).
  where(:brands => {:id => 123}). 
  where(:brands => {:brand_influencers => {:top => true}})

Я почти уверен, что он работает аналогично в 2.3.x.Попробуйте это:

DataRecord.joins(:influencers => {:brand_influencers}, :brands).
  conditions(:brands => {:id => 123}). 
  conditions(:brands => {:brand_influencers => {:top => true}})

Я бы посоветовал вам построить отношение постепенно и проверить генерируемый SQL.Удачи!

0 голосов
/ 08 июня 2011

Звучит так, как вы хотите использовать

has_many :foos, :through=>:bar

или

has_one :foo, :through=>:bar

Попробуйте это:

class DataRecord < ActiveRecord::Base
  # how does this relate to the other models?
end

class Brand < ActiveRecord::Base
 has_and_belongs_to_many :influencers
end

class Influencer < ActiveRecord::Base
  has_and_belongs_to_many :brands
end

class BrandsInfluencers < ActiveRecord::Base
  # notice the name change in this class (pluralization)
  belongs_to :brand
  belongs_to :influencer
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...