Default_scope для таблицы соединений - PullRequest
6 голосов
/ 28 марта 2011

У меня есть модель, подобная следующей:

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 для того, чтобы заставить область таблицы соединений работать между ассоциациями, не указывая ее? Существует ли один?

Ответы [ 2 ]

10 голосов
/ 28 марта 2011

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

В классе User установите отношение has_many следующим образом:

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

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

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

2 голосов
/ 29 марта 2011

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

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

...