Default_scope в таблице соединений

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

class User
  has_many :items
  has_many :words, :through => :items
end

class Item
  belongs_to :user
  belongs_to :word

  default_scope where(:active => true)
end

class Words
  has_many :items
end

У меня проблема в том, что default_scope не применяется к следующей ассоциации:

 user.words

Вместо этого SQL:

SELECT `words`.* FROM `words` INNER JOIN `items` ON `words`.id = `items`.word_id WHERE ((`items`.user_id = 1)) AND ((`items.active = 1))

Я получаю этот SQL в журналах:

SELECT `words`.* FROM `words` INNER JOIN `items` ON `words`.id = `items`.word_id WHERE ((`items`.user_id = 1)) 

Я полагаю, это связано с тем, что область действия по умолчанию работает для обычной модели и ее дочерней ассоциации, но не для таблиц соединения.

Каков правильный способ Rails заставить область таблицы соединений работать между ассоциациями без необходимости указывать ее? Существует ли один?


person joeellis    schedule 28.03.2011    source источник


Ответы (2)


Разобрался с ответом с помощью dfr от #ruby-on-rails.

В классе User установите для отношения has_many значение:

 has_many :words, :through => :items, :conditions => { "items.active" => true }

Это связано с тем, что, хотя между пользователем и Word существует ассоциация соединения habtm, модель элемента фактически не загружается при вызове user.words. Поэтому вы должны применить область ассоциации в модели пользователя.

Надеюсь, что это помогло кому-то.

person joeellis    schedule 28.03.2011

Спасибо, это полезно. Этот билет (хотя и недействительный) также обсуждается людьми: https://rails.lighthouseapp.com/projects/8994-ruby-on-rails/tickets/3610-has_many-through-associations-may-не-соблюдение-условий-по-умолчанию-по-умолчанию#ticket-3610-17

Лично я считаю, что этот билет НЕ недействителен. Область действия по умолчанию — область действия по умолчанию.

person releod    schedule 29.03.2011
comment
Я согласен. Похоже, что модель соединения должна загружаться при вызове ассоциации. Я предполагаю, что это не ради оптимизации. Тем не менее, я думаю, что модель соединения — это правильное место для размещения этой области, а не просто зависание от метода has_many в модели пользователя. - person joeellis; 30.03.2011