2013-04-15 5 views
1

У меня есть следующий фрагмент кода, на мой взгляд:методы модели в представлениях

<% if @user.get_products.any? %> 
    <%= f.select('products', @user.get_products.collect { |user| [user.name, user.id]}) %> 

Где get_products предпринимает ActiveRecord запрос к БД. Поэтому я задаюсь вопросом, действительно ли он выполняет два одинаковых запроса или использует кешированный результат из первого запроса во втором вызове? Я пытался проверить это в журналах сервера, но ничего не нашел. Я также хотел бы знать, могу ли я каким-то образом контролировать это поведение, т. Е. Установить/отключить кеш для этого представления.

Спасибо!

UPDATE:

Я думаю, что это нарушает MVC тоже, но то, что смущало меня было предупреждение IDE: «точка зрения не должна разделять более двух переменных с контроллера.»

Тем не менее, я создаю несколько страниц «одной страницы», поэтому мне нужно иметь @user, @nearest_users и @user_products в том же виде. Так что я нашел следующую статью:
http://matthewpaulmoore.com/post/5190436725/ruby-on-rails-code-quality-checklist#instances

который сказал

только один или два переменных экземпляра распределяются между каждым контроллером и зрением.

Инстанс переменный ад - когда много переменных экземпляра разделены между контроллером и видом - это легко сделать в Rails. Это также потенциально опасно для производительности, потому что вы можете в конечном итоге сделать дублирующими звонками по ассоциациям неосознанно. Вместо этого ваш контроллер должен управлять только одной переменной экземпляра - и, возможно, секундой для current_user. Таким образом, все вызовы в ассоциации загружаются «по запросу» и могут быть кэшированы с помощью экземпляра в одном месте.

Эта методология также хорошо подходит для кэширования фрагментов, потому что вы можете проверить кеши во взглядах, прежде чем загружать ассоциации.

Например, вместо того, чтобы ваш контроллер Блог создать переменный экземпляр как для @post и @related_posts, просто сделать один метод, @post и дать Опубликуйте модель метода related_posts, так что вы можете просто назовите @ post.related_posts в своих представлениях.

+4

Это обычно считается плохой практикой, потому что это нарушает замену MVC и Liskov. Попробуйте обратиться к ActiveRecord с помощью вашего контроллера или помощника. Возможно, вам следует назначить @products, и вы можете найти проблему с более мелкозернистыми тестами. – Tsagadai

+0

, если вы посмотрите на журналы своего сервера, вы должны увидеть запрос в синем для запрошенных и фиолетовых для кеширования.Соглашение состоит в том, чтобы просто использовать 'products', а не' get_products' btw – AJcodez

ответ

2

Чтобы ответить на ваш вопрос: Запросы не просматриваются.

Более того, коды Ruby в шаблоне ERB выполняются с использованием eval, что очень неэффективно.

Так что мой совет: избегать написания логики в виду, это своего рода плохая практика.

+0

Я узнал об этом со слайда в RubyConf China 2012. Вы не можете читать по-китайски, но в случае, если вы это сделали, вот слайд: http: // blog. xdite.net/posts/2012/11/20/rubyconf-china-2012-ten-slow-things-you-dont-know/ –

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