Какой код Ruby on Rails для этого SQL-запроса? - PullRequest
1 голос
/ 05 мая 2011

Я нуб в Ruby on Rails.У меня есть запрос, который покажет, какая комната / ammenity доступны.Это работало в программировании на C #, но я не знаю, как реализовать это в Ruby on Rails.

Select distinct A.id, A.a_name From Amenities A
    Where A.id not in 
    (
    Select Aa.id From Amenities Aa, Amenity_List AL Where 
    A.id = AL.amenities_id AND 
        (
            (params[:start_date] BETWEEN AL.checkin AND AL.checkout) OR 
            (params[:end_date] BETWEEN Al.checkin AND AL.checkout)
        )
    )
Order by A.id

HELP.Спасибо!:)

ЗДЕСЬ мои модели:

class Amenity < ActiveRecord::Base
   has_many :amenity_lists
   has_many :line_items
end

class AmenityList < ActiveRecord::Base

  belongs_to :transaction
  belongs_to :amenity

  scope :range, where(:checkin => (params[:start_date])..(params[:end_date]) || :checkout => (params[:start_date])..(params[:end_date]) )

  scope :available, find_by_sql(["Select DISTINCT amenities.id, amenities.a_name" +
                "where amenities.id NOT IN (Select amenities.id from amenities, amenity_lists where amenity.id = amenity_list.amenities_id AND ?)", :range])

end

я кодирую это так.но это не сработало.я пытаюсь отобразить все доступные удобства, указанные в start_date и end_date.

вот журнал:

 c:/Sites/fourk/app/models/amenity_list.rb:6: 
 syntax error, unexpected tASSOC, expecting ')' ...ams[:end_date]) || :checkout => (params[:start_date])..(para... ... ^ c:/Sites/fourk/app/models/amenity_list.rb:6: 
 syntax error, unexpected ')', expecting keyword_end

1 Ответ

0 голосов
/ 05 мая 2011

Хорошо, я предполагаю, что вы хотите найти доступные удобства - те, которые не забронированы.

Я бы предложил использовать named_scope вместо scope, а также перенести его определение в класс Amenity, если вы хотите найти доступные удобства.

Возможное решение - использовать именованную область со встроенным SQL-запросом:

class Amenity < ActiveRecord::Base
  has_many :amenity_lists

  named_scope :available, lambda {
    |start_date, end_date| { 
      :select => 'amenities.*',
      :order => 'id',
      :conditions => ["
        amenities.id NOT IN 
        (
          SELECT aa.id from amenities aa, amenity_lists al WHERE
          amenities.id = al.amenity_id AND
          (
            (? BETWEEN al.checkin AND al.checkout) OR
            (? BETWEEN al.checkin AND al.checkout)
          )
        )", 
        start_date, 
        end_date
      ] 
    }
  }
end

Просто обратите внимание, что в Ruby строки могут занимать несколько строк.

Теперь вы можете использовать данную именованную область видимости следующим образом:

start_date = ...
end_date = ...
available_amenities = Amenity.available(start_date, end_date)

Создает следующий запрос SQL:

SELECT amenities.* FROM "amenities" 
WHERE (
 amenities.id NOT IN 
 (
  SELECT aa.id from amenities aa, amenity_lists al 
  WHERE
   amenities.id = al.amenity_id AND
   (
    ('2011-05-10 23:57:09' BETWEEN al.checkin AND al.checkout) OR
    ('2011-05-10 23:57:09' BETWEEN al.checkin AND al.checkout)
   )
 )
) ORDER BY id

Кроме того, если вы новичок в мире Rails, я настоятельно рекомендую вам посмотреть серию Райана Бейтса Railscasts . Эпизод 108 о named_scope с. Посмотрев этот фильм, наберитесь терпения и начните с эпизода 1.:)

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