2016-10-18 3 views
0

У меня есть много-ко-многим/имеет-много-через отношений в моем подключении моей модели рецепта моей бирки модель таким образом, что:Rails 4: Turn сложного фильтра в сферу

class Tag < ActiveRecord::Base 
    has_many :taggings 
    has_many :recipes, through: :taggings 
end 

class Tagging < ActiveRecord::Base 
    belongs_to :tag 
    belongs_to :recipe 
end 

class Recipe < ActiveRecord::Base 
    has_many :taggings 
    has_many :tags, through: :taggings 
end 

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

Например, это поможет мне все рецепты маркированные с заданным именем:

def self.tagged_with(name) 
    Tag.find_by_name!(name).recipes 
end 

ответ

-1

Вы можете в основном конвертировать большинство ассоциаций-метод-цепей (хотя и не все *) в сферу

например я «d попробовать это (примечание: не проверяется на ошибки) и посмотреть, как оказалось

scope :tagged_with, ->(name) { find_by_name!(name).recipes } 

Если это не сработает, я хотел бы попробовать что-то вроде:

scope :tagged_with, ->(name) { where(:name => name).first.recipes } 

[*] Большая проблема с использованием областей над методом-цепочки является то, что find/first может иногда странные вещи, если он не находит один ... код в Rails буквально по умолчанию в all сферы в в некоторых случаях (это действительно странное поведение, которое, я думаю, не должно произойти), поэтому для областей, которые находят только один элемент, я часто не буду разбираться в области и использовать класс-метод, как вы изначально.

+0

Извините, но это не сработает –

+0

Это не позволяет цепочки, как я ожидал –

+0

Да, это не позволит цепочки, потому что вы выбираете только один. Не могли бы вы обновить свой вопрос на примере того, как вы хотели бы использовать его (если бы он существовал), давая конкретный пример другим цепным методам? Это может быть так: а) то, что вы хотите сделать, на самом деле не может быть сделано b) то, что вы хотите сделать, может быть лучше сделано другим способом –