Как я должен использовать область в Rails 3? - PullRequest
0 голосов
/ 20 сентября 2011

У меня есть две модели:

Во-первых:

class CountryList < ActiveRecord::Base
  has_one :country, :dependent => :nullify
end

Второе:

class Country < ActiveRecord::Base
  belongs_to :country_list
end

Мне нужно создать область в модели CountryList, которая будет включать все записи без связи со страной.

Что-то вроде этого:

CountryList.all.each do |country_list|
  country_list.country.nil?
end 

Ответы [ 3 ]

1 голос
/ 20 сентября 2011

У меня здесь нет терминала, но:

class CountryList < ActiveRecord::Base
   scope :no_country, joins('LEFT OUTER JOIN countries ON (country_list_id = #{id})').where(:countries => {:country_id => nil})
end

Я почти уверен, что часть # {id} выдаст вам предупреждение, но я не могу вспомнить правильный синтаксис в R3.

1 голос
/ 20 сентября 2011
class CountryList < ActiveRecord::Base
  has_one :country, :dependent => :nullify
  scope :countryless, where(:country_id => nil)
end

CountryList.countryless.all
1 голос
/ 20 сентября 2011

Вы можете сделать что-то вроде этого:

class CountryList < ActiveRecord::Base
  def self.without_countries
    joins(:country).
    select("country_lists.*, COUNT(countries.id) AS country_count").
    group("country_lists.id").
    having("country_count = 0")
  end
end

но, пожалуйста, обратите внимание, это может быть не самый быстрый запрос на западе. лучшим подходом будет использование счетчика ActiveRecord counter_cache, но для этого нужен дополнительный столбец, и это своего рода денормализация, подробности можно найти здесь . counter_cache определенно намного быстрее, и если вы не выйдете из ActiveRecord, т. Е. Вы не будете манипулировать своей базой данных с помощью необработанного SQL, минуя свой ActiveRecord ORM, денормализация не повредит вам.

кстати. я предполагаю, что вы имели в виду

CountryList.all.select do |country_list|
  country_list.countries.empty?
end
...