Ruby on Rails: создание связанных моделей с помощью find_by_sql? - PullRequest
4 голосов
/ 05 марта 2010

Очевидно, что include и select не могут использоваться одновременно в поисковом запросе Rails, и это неоднократно отмечалось как wontfix:
http://dev.rubyonrails.org/ticket/7147
http://dev.rubyonrails.org/ticket/5371

Это кажется мне очень неудобным, потому что времена, которые я хотел бы использовать, включают в себя точно такое же время, как я хотел бы использовать select - когда важен каждый бит производительности.

Есть ли способ обойти это и вручную сгенерировать комбинированный include-with-select с помощью find_by_sql или любым другим методом? Проблема в том, что я не знаю какого-либо способа эмулировать функциональность include, когда он создает экземпляры моделей в памяти для хранения включенных связанных моделей, так что я могу ввести model1.associated_models и не допустить повторного попадания в базу данных.

1 Ответ

4 голосов
/ 24 декабря 2010

Рассматривали ли вы создание модели для просмотра базы данных? Например:

  • Создание представления базы данных с помощью сложного запроса SQL:

    CREATE VIEW production_plan_items AS
        SELECT * FROM [...]
        INNER JOIN [...];
    
  • Создать модель для этого вида:

    # app/view_model.rb
    class ViewModel < ActiveRecord::Base
      self.abstract_class = true
    
      def readonly?
        true
      end   
    
      def before_destroy
        raise ActiveRecord::ReadOnlyRecord
      end 
    end
    
    # app/models/logical/production_plan_item.rb
    module Logical
      class ProductionPlanItem < ::ViewModel
      end
    end
    
  • Используйте как всегда, но помните, что эти записи ЧИТАЙТЕ ТОЛЬКО!

    Logical::ProductionPlanItem.where( ... )
    

Если производительность все еще будет проблемой в будущем, вы можете довольно легко преобразовать представления БД в материализованные представления, используя триггеры и хранимые процедуры. Это даст вашему приложению огромный прирост скорости, и вам не придется менять даже одну строку кода Rails.

Enterprise Rails настоятельно рекомендуется прочитать: http://www.amazon.com/Enterprise-Rails-Dan-Chak/dp/0596515200/ref=sr_1_1?ie=UTF8&qid=1293140116&sr=8-1

...