Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/52.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 如何将复杂的sql查询w/join修改为rails 3_Ruby On Rails_Activerecord_Mysql_Ruby On Rails 3 - Fatal编程技术网

Ruby on rails 如何将复杂的sql查询w/join修改为rails 3

Ruby on rails 如何将复杂的sql查询w/join修改为rails 3,ruby-on-rails,activerecord,mysql,ruby-on-rails-3,Ruby On Rails,Activerecord,Mysql,Ruby On Rails 3,我正在开发一个拼车应用程序,用户可以添加电梯,并且可以通过c、d、e为每个电梯a到B选择多个站点。现在,当用户在数据库中搜索电梯时,结果还应该包括“a到d”、“c到B”或“c到e”等电梯。 我使用下面的代码在Rails2.3.5中实现了这一点,但很难将其转移到Rails3。我确信必须有一种更干净的方法来实现我试图做的事情,并将一些代码移动到模型中 如果有人能在这件事上帮我,那就太好了 class Lift < ActiveRecord::Base has_many :stops end

我正在开发一个拼车应用程序,用户可以添加电梯,并且可以通过c、d、e为每个电梯a到B选择多个站点。现在,当用户在数据库中搜索电梯时,结果还应该包括“a到d”、“c到B”或“c到e”等电梯。 我使用下面的代码在Rails2.3.5中实现了这一点,但很难将其转移到Rails3。我确信必须有一种更干净的方法来实现我试图做的事情,并将一些代码移动到模型中

如果有人能在这件事上帮我,那就太好了

class Lift < ActiveRecord::Base
  has_many :stops
end

class Stop < ActiveRecord::Base           
  belongs_to :lift
  belongs_to :city  
end

class City < ActiveRecord::Base
  has_one :stop
end


@lifts = Lift.find(
  :select =>     "lifts.id, bs.city_id as start_city_id, bs2.city_id as destination_city_id",
  :from =>       "lifts",
  :joins =>      "LEFT JOIN stops bs ON lifts.id = bs.lift_id
                  LEFT JOIN stops bs2 ON lifts.id = bs2.lift_id
                  JOIN cities bc ON bs.city_id = bc.id
                  JOIN cities bc2 ON bs2.city_id = bc2.id",
  :include =>    [:stops, :cities],
  :conditions => "bs.lift_id = bs2.lift_id AND bs.position < bs2.position"
                  #uses the position attribute to determine the order of the stops
)

我知道这是一个非常简单的答案,但是为什么不使用这些选项在模型中创建一个作用域呢?

我有点困惑,因为您正在同时使用find的:选择和:包含选项。我知道一个事实:当你使用:include时,select被忽略了,不过我认为有一个插件可以解决这个问题。此外,还包括:cities,这是一种代码中没有出现的关系

无论如何,如果你想给你的提升模型添加一些范围,我会考虑切换到AREL API,这是Rails 3中的首选方法。p> 您可以将整个查询填充到一个范围中,但您认为不需要:from选项-可能是错误的:

class Lift
...
  scope :with_all_stops, select('lifts.id, bs.city_id as start_city_id, bs2.city_id as destination_city_id').\
                         joins('LEFT JOIN stops bs ON lifts.id = bs.lift_id ' +
                               'LEFT JOIN stops bs2 ON lifts.id = bs2.lift_id ' +
                               'JOIN cities bc ON bs.city_id = bc.id ' +
                               'JOIN cities bc2 ON bs2.city_id = bc2.id').\
                         includes(:stops, :cities).\
                         where('bs.lift_id = bs2.lift_id AND bs.position < bs2.position')
...
end
那就打电话叫电梯吧。或者你也可以根据自己的条件来选择:电梯,全站,地点'cities.name=Topeka'。它真的很强大


如果该查询的某些部分在这种特定情况下本身是有用的,那么可以将它们分解到它们自己的范围中,然后在调用时将它们链接在一起。或者在另一个范围内将它们链接在一起,然后调用它。就像我说的,阿雷尔真的很强大。

我也想过,但我不知道如何正确处理连接。也许你能给我一些建议。