Outer Join The Rails 3 Way - PullRequest
       9

Outer Join The Rails 3 Way

4 голосов
/ 23 марта 2011

У меня есть 3 модели, такие как:

location, user, discovered_location(location_id,user_id)

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

Мне нужно что-то вроде {location1, location2, location3:includes discovered_location, location4 ..}

Есть ли Rails 3 способ сделать это? Если нет, то как лучше?

EDIT

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

пользователь {location1, location2, location3:includes discovered_location, location4 ..}

(У пользователя много обнаруженных мест)

Ответы [ 3 ]

8 голосов
/ 23 марта 2011

Вы можете выполнить внешнее объединение в Rails только с помощью литерала SQL в методе joins:

joins("OUTER JOIN table2 on table2.column = table1.column")
3 голосов
/ 08 апреля 2014

joins делает внутреннее соединение, includes делает внешнее соединение.

http://guides.rubyonrails.org/active_record_querying.html#specifying-conditions-on-eager-loaded-associations

3 голосов
/ 23 марта 2011

Вы должны убедиться, что идентификатор пользователя в вашей обнаруженной таблице местоположений либо равен идентификатору рассматриваемого пользователя, либо равен нулю. Это легко сделать с помощью гема meta_where . Даны следующие модели:

class User < ActiveRecord::Base
  has_many :discovered_locations
  has_many :locations, :through => :discovered_locations
end

class Location < ActiveRecord::Base
  has_many :discovered_locations
  has_many :users, :through => :discovered_locations
end

class DiscoveredLocation < ActiveRecord::Base
  belongs_to :user
  belongs_to :location
end

Вставьте некоторые фиктивные данные, затем выполните инструкцию, такую ​​как это:

Location.includes(:discovered_locations).where(
  {:discovered_locations => {:user_id => User.first.id}} | 
  {:discovered_locations => {:user_id => nil}}
).each do |loc|
  puts "#{loc.name} #{loc.discovered_locations.empty? ? 'not visited' : 'visited'}"
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...