2011-05-05 70 views
1

我在Ruby on Rails的noob。我在这里有一个查询,将显示可用的房间/ ammenity。它确实在C#编程中工作,但我不知道如何在Ruby on Rails中实现它。这个SQL查询的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 

帮助。谢谢! :)

这里是我的模型:

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]) 

我这样的代码吧。但它不起作用。我正在尝试显示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 
+4

与其给我们一些sql并说“把它翻译成rails”,如果描述你真正想做的事情会更好。例如简要描述相关模型与您想要回归的结果之间的关系。 – 2011-05-05 10:11:46

回答

0

好吧,我想你想找到可用的设施---那些没有预订。

我会建议使用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中,字符串可以跨越多行。

现在你可以使用给定的命名范围是这样的:

​​

这将产生以下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集开始。:)

+0

这是日志------ c:/Sites/fourk/app/models/amenity_list.rb:6:语法错误,意外的tASSOC,期待')' ... ams [:end_date])|| :checkout =>(params [:start_date])..(para ... ...^ c:/Sites/fourk/app/models/amenity_list.rb:6:语法错误,意外的')',期待keyword_end – Crisgine 2011-05-05 12:32:34

+0

您能否将日志追加到问题的底部? – Behrang 2011-05-05 14:47:50

+0

终于!有效。非常感谢!!! :) – Crisgine 2011-05-10 19:03:25