2012-03-22 5 views
3

Я пытаюсь выяснить, есть ли способ повторно использовать область из AR-вызова. Вот мой примерRails 3 - Цепочка доступа для повторного использования

@current_account.items.report_by_month(month, year) 

Внутри report_my_month сферы, я хотел бы повторно использовать @current_account

def self.report_by_month(month, year) 
    values = Values.where(:current_account => USE SCOPE FROM SELF) 
    scope = scoped{} 
    scope = scope.where(:values => values) 
end 

Это только пример кода, чтобы выяснить, как это сделать, потому что запрос является гораздо более сложным так как это отчет. Благодаря!

+0

Пожалуйста, ваш код модели .. –

+0

модель массивна, и я пытаюсь получить доступ к current_account в self.report_by_month. Не уверен, почему остальная часть модели будет даже актуальной. Попытка выяснить, могу ли я получить scope.current_account.subdomain или что-то в этом роде – bokor

+1

Нам не нужен весь код модели, но размещение отношений между моделями поможет вам быстрее получить ответ. –

ответ

3

Есть ли причина, по которой вы не можете просто передать ее в качестве дополнительного параметра?

def self.report_by_month(month, year, current_account) 
    values = Values.where(:current_account => current_account) 
    scope = scoped{} 
    scope = scope.where(:values => values) 
end 

Вызывается с

@current_account.items.report_by_month(month, year, @current_account) 

Edit:

Если вы просто пытаетесь избежать того, чтобы пройти @current_account снова, я предложил бы добавить метод экземпляра вашего класса Account для этого ,

class Account 
    has_many :items 

    def items_reported_by_month(month, year) 
    self.items.report_by_month(month, year, id) 
    end 
end 

Что вы могли бы назвать с

@current_account.items_reported_by_month(month, year) 
+0

Это желаемый эффект. Мне любопытно узнать, доступен ли контекст, который был вызван областью, неявно. Если возможно, я хочу избегать делать что-то вроде 'current_user.invoices.overdue_for (current_user)'. – nfm

+1

Короткий ответ заключается в том, что метод ограничен областью действия класса, поэтому ваш объем - это сам класс, а не экземпляр класса. – engineerDave

+1

Области - это, по сути, методы класса, которые изменяют один экземпляр ActiveRecord :: Relation. Вы не создаете новый экземпляр каждый раз, когда вы вызываете метод, поэтому нет никакой цепи, чтобы идти вверх. Я обновил свой ответ с помощью решения, которое позволяет избежать вызовов типа 'current_user.invoices.overdue_for (current_user)'. – sgrif

Смежные вопросы