Доступ к вспомогательным методам рельсов в моделях - PullRequest
1 голос
/ 22 сентября 2010

В Rails 3 у меня проблема с доступом к вспомогательному методу из модели

В моем ApplicationController у меня есть вспомогательный метод current_account, который возвращает учетную запись, связанную с вошедшим в данный момент пользователем. У меня есть модель проекта, которая содержит проекты, связанные с этой учетной записью. Я определил «own_to: account» в моей модели проекта и «has_many» в моей модели аккаунта. Кажется, все это работает правильно, и мои проекты связаны с правильными учетными записями.

Однако в тот момент, когда я использую «Project.all», все записи проекта возвращаются так, как вы ожидаете. Мне бы хотелось, чтобы он автоматически фильтровал проекты так, чтобы возвращались только проекты, связанные с указанной учетной записью, и я хотел бы, чтобы это было поведение по умолчанию

Поэтому я попытался использовать default_scope. Линия в моей модели выглядит примерно так

default_scope :order => :name, :conditions => ['account_id = ?', current_account.id]

Это выдает ошибку, говорящую

Неопределенная локальная переменная или метод current_account для #

Если я поменяю местами вызов current_account.id для целочисленного идентификатора - например,

default_scope :order => :name, :conditions => ['account_id = ?', 1]

Все работает правильно. Как сделать метод current_account доступным для моей модели

Большое спасибо

Ответы [ 4 ]

4 голосов
/ 22 сентября 2010

Вы не можете получить доступ к сеансу из моделей. Вместо этого передайте учетную запись в качестве параметра в именованную область.

#controller
Model.my_custom_find current_account

#model.rb

named_scope :my_custom_find, lambda { |account| { :order => :name, :conditions => ['account_id = ?', account.id]}}

Я еще не использовал rails 3, поэтому, возможно, named_scopes изменился.

2 голосов
/ 16 ноября 2010

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

В контроллере:

@products = current_account.products.all

Штраф за просмотр области, но ...

В модели:

class Inventory < ActiveRecord::Base
  belongs_to :account # has fk account_id
  has_many :inventory_items, :dependent => :destroy
  has_many :products, :through => :inventory_items
end

class Product < ActiveRecord::Base
  has_many :inventory_items

  def level_in(inventory_id)
    inventory_items.where(:inventory_id => inventory_id).size
  end

  def total_level
    # Inventory.where(:account_id => ?????) <<<<<< ISSUE HERE!!!! 
    Inventory.sum { |inventory| level_in(inventory.id) }
  end
end

Как это можно определить?

1 голос
/ 22 сентября 2010

+ 1 за ответ марки. Это все еще должно работать в Rails 3.

Просто показываю вам рельсы 3 пути с областью действия и новым API запроса:

scope :my_custom_find, lambda { |account| where(:account_id=>account.id).order(:name) }
0 голосов
/ 23 сентября 2010

У вас настроена ассоциация, поэтому вы не могли просто использовать:

@projects = current_account.projects.all

... в вашем контроллере?

Я не настроил синтаксис набыть в стиле Rails 3, так как я все еще учусь сам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...