Używam schematów postgres w mojej aplikacji Rails, więc nie ma jasnego sposobu na zapytanie wszystkich firm (dla naszych własnych analiz). Chciałbym zaimplementować każdą metodę, która sprawdza się we wszystkich firmach i odpowiednio zmienia schemat postgres.Dodawanie zmiennej mixin na poziomie klasy w Ruby
Chciałbym móc zadzwonić:
Company.each do |company|
# do something in the context of each company
end
ale Chciałbym również, aby niektóre z innych metod, takich jak collect
przeliczalny w tym przykładzie na uzyskanie wszystkich menedżerów we wszystkich spółkach:
Company.collect do |company|
Users.managers
end
Obecnie mam ten, który działa dobrze
class Company < ActiveRecord::Base
# ...
def self.each(&block)
Company.all.each do |company|
if Schemas.include? company.subdomain
# this changes to that company's schema so all queries are scoped
Apartment::Database.switch company.subdomain
yield company if block_given?
end
end
end
ale jak zrobić Dostaję Zmienna liczba na poziomie klasy, a nie na poziomie instancji.
czyli kiedy include Enumerable
jest w klasie, metody przeliczalny sprawdzony jak
company = Company.new
# which might iterate over the contents (users?) in a company
company.collect {|u| u}
ale chcę zadzwonić
# iterate over all companies and collect the managers
Company.collect {|c| User.managers}
i mieć go używać
Company.each
czuję podobna odpowiedź jest oczywista, ale moje metaprogramowane foo jest dziś słabe.
To pytanie ma wiele rzeczy do nauki dla mnie .. –
FYI: Początkowo próbowałem zrobić to z klasą ActiveRecord. Nie rób tego! Dostaniesz naprawdę dziwne niepowodzenia, gdy zadzwonisz na Company.count i nie będzie już wywoływał metody licznika ActiveRecord do zliczania wierszy baz danych. Pamiętaj, że moduł Enumerable jest naprawdę duży – ideasasylum