Можете ли вы рассказать мне о достойном рубиновом камне, который я могу использовать для сложных объединений? - PullRequest
1 голос
/ 27 мая 2010

Пигги, откатывая другой вопрос, который я отправил , у меня есть комплекс find(), который изменяется независимо от того, является ли определенный идентификатор нулевым или нет. Смотрите здесь:

if self.id.nil?
  blocks = AppointmentBlock.find(:first,
    :conditions => ['appointment_blocks.employee_id = ? and ' +
                    '(time_slots.start_at between ? and ? or time_slots.end_at between ? and ?)',
    self.employee_id, self.time_slot.start_at, self.time_slot.end_at,
    self.time_slot.start_at, self.time_slot.end_at],
    :joins => 'join time_slots on time_slots.time_slot_role_id = appointment_blocks.id')
else
  blocks = AppointmentBlock.find(:first,
    :conditions => ['appointment_blocks.id != ? and ' +
                    'appointment_blocks.employee_id = ? and ' +
                    '(time_slots.start_at between ? and ? or time_slots.end_at between ? and ?)',
    self.id, self.employee_id, self.time_slot.start_at, self.time_slot.end_at,
    self.time_slot.start_at, self.time_slot.end_at],
    :joins => 'join time_slots on time_slots.time_slot_role_id = appointment_blocks.id')
end

Мне интересно, есть ли там гем, который позволяет мне передавать: first и: условие type в виде блока кода. Я видел ez_where на github , но не был уверен, был ли он заброшен или нет, так как в последнее время он не работал (хотя это может означать, что он очень твердый, без ошибок) Есть идеи?

Ответы [ 2 ]

2 голосов
/ 27 мая 2010

Вы также можете взглянуть на Арель , который:

Арел - это реляционная алгебра для Ruby. Это 1) упрощает генерацию комплекс SQL-запросов

Подход также встроен в Rails 3. Обеспечивает действительно элегантную поддержку для построения сложных цепочек областей и запросов.

1 голос
/ 27 мая 2010

Когда у меня сложный SQL-запрос, включающий много объединений, UNION и т. Д., Я создаю представление в mysql. Затем я создаю модель ActiveRecord и могу напрямую читать результаты через ActiveRecord.

Еще одним преимуществом этого метода является то, что сложный SQL и его план выполнения будут рассчитываться только один раз в дБмс (при создании представления), а не при каждом выполнении.

В зависимости от ситуации, я использую грабли или миграцию для создания / повторного создания представлений.

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

Добавлено:

Пример

class SessionViews2 < ActiveRecord::Migration
  def self.up
    execute "DROP View if exists room_usages"   # Dropping both view and table
    execute "DROP Table if exists room_usages"  # has helped in some corner cases
    execute "CREATE VIEW room_usages AS
 SELECT
    CONCAT(rooms.id,schedules.id) as id 
  , rooms.id             as room_id            
  , rooms.conference_id  as conference_id 
  , rooms.popular_room   as room_popular_room  
  , schedules.id                   as schedule_id
  , schedules.timetable_id         as schedule_timetable_id                  
  , schedules.display_start_time   as schedule_display_start_time    
  , schedules.display_end_time     as schedule_display_end_time       
  , sess.id                as session_id           
  , sess.title             as title            
  , sess.subtitle          as subtitle         
  FROM 
    rooms
    INNER JOIN schedule_rooms ON rooms.id = schedule_rooms.room_id
    INNER JOIN schedules ON schedule_rooms.schedule_id = schedules.id
    INNER JOIN sessions as sess ON schedules.session_id = sess.id
  WHERE
    schedule_rooms.cancelled_time IS NULL 
    AND schedules.cancelled_time IS NULL"  
  end

  def self.down
    execute "DROP View if exists room_usages"
    execute "DROP Table if exists room_usages"
  end
end

Модель room_usage.rb

class RoomUsage < ActiveRecord::Base

  ############################################################
  #                                                          #
  #        This is a VIEW! No DB table, Read-Only            #
  #                                                          #
  ############################################################

  belongs_to :conference
  belongs_to :timetable, :foreign_key => :schedule_timetable_id
  belongs_to :session

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