2016-01-22 66 views
0

我有一個現有的數據庫,我正試圖映射到Ruby on Rails ActiveRecords。其中一個表格是一個「富裕連接」表,它具有預先計算出的郵政編碼和機場之間的距離。 'zipcode'(char)列是郵政編碼數據庫表的主鍵。表格定義如下。Ruby on Rails豐富許多:很多,使用WHERE子句

現在我有以下的Rails模型(他們只要工作,我可以檢索鏈接到郵政編碼的所有機場):

zipcode.rb:

class Zipcode < ActiveRecord::Base 
    has_many :zipcode_airports, :foreign_key => :zipcode 
    has_many :airports, :through => :zipcode_airports 
end 

zipcode_airport.rb

class ZipcodeAirport < ActiveRecord::Base 
    self.table_name = "airport_zip_distances" 
    belongs_to :zipcode, :foreign_key => :zipcode 
    belongs_to :airport 
end 

所以此工程:

irb(main):001:0> z = Zipcode.find("90210") 
    Zipcode Load (0.7ms) SELECT `zipcodes`.* FROM `zipcodes` WHERE `zipcodes`.`zipcode` = '90210' LIMIT 1 
=> #<Zipcode zipcode: "90210", latitude: 34.0901, longitude: -118.406> 

至於做這個的:

irb(main):002:0> z.airports 
    Airport Load (738.4ms) SELECT `airports`.* FROM `airports` INNER JOIN `airport_zip_distances` ON `airports`.`airport_id` = `airport_zip_distances`.`airport_id` WHERE `airport_zip_distances`.`zipcode` = '90210' 
=> #<ActiveRecord::Associations::CollectionProxy [#<Airport airport_id: 11, name: "RIO VISTA MUNI", latitude: 38.1933, longitude: -121.704>, #<Airport airport_id: 12, name: "MARBLE CANYON", latitude: 36.8108, longitude: -111.645>, #<Airport airport_id: 13, name: "MONTEREY RGNL", latitude: 36.587, longitude: -121.843>, #<Airport airport_id: 14, name: "HOOPA", latitude: 41.0415, longitude: -123.668>, #<Airport airport_id: 15, name: "LEACH", latitude: 37.785, longitude: -106.047>, #<Airport airport_id: 16, name: "MANTI–EPHRAIM", latitude: 39.3315, longitude: -111.613>, #<Airport airport_id: 17, name: "MEADOWS FLD", latitude: 35.4338, longitude: -119.058>, #<Airport airport_id: 18, name: "GRAVELLY VALLEY", latitude: 39.4507, longitude: -122.955>, #<Airport airport_id: 19, name: "GUSTINE", latitude: 37.2605, longitude: -120.964>, #<Airport airport_id: 20, name: "CALIFORNIA PINES", latitude: 41.4122, longitude: -120.684>, ...]> 

現在,我試圖找出如何限制返回的記錄到那些,例如,airport_zip_distances.distance_in_miles < 7英里。

此查詢的工作,我只是不知道如何正確地把一切設置在Rails中得到它的制定是:

mysql> SELECT `airports`.* FROM `airports` INNER JOIN `airport_zip_distances` ON `airports`.`airport_id` = `airport_zip_distances`.`airport_id` WHERE `airport_zip_distances`.`zipcode` = '90210' AND `airport_zip_distances`.`distance_in_miles` < 7; 
+------------+-------------------+----------+-----------+ 
| airport_id | name    | latitude | longitude | 
+------------+-------------------+----------+-----------+ 
|   37 | SANTA MONICA MUNI | 34.0158 | -118.451 | 
+------------+-------------------+----------+-----------+ 

這裏的數據庫表的佈局,如果它很重要...

mysql> describe airports; 
+------------+--------------+------+-----+---------+----------------+ 
| Field  | Type   | Null | Key | Default | Extra   | 
+------------+--------------+------+-----+---------+----------------+ 
| airport_id | int(11)  | NO | PRI | NULL | auto_increment | 
| name  | varchar(255) | YES |  | NULL |    | 
| latitude | float  | YES |  | NULL |    | 
| longitude | float  | YES |  | NULL |    | 
+------------+--------------+------+-----+---------+----------------+ 

mysql> describe zipcodes; 
+-----------+---------+------+-----+---------+-------+ 
| Field  | Type | Null | Key | Default | Extra | 
+-----------+---------+------+-----+---------+-------+ 
| zipcode | char(5) | NO | PRI | NULL |  | 
| latitude | float | YES |  | NULL |  | 
| longitude | float | YES |  | NULL |  | 
+-----------+---------+------+-----+---------+-------+ 

mysql> describe airport_zip_distances; 
+-------------------+---------+------+-----+---------+----------------+ 
| Field    | Type | Null | Key | Default | Extra   | 
+-------------------+---------+------+-----+---------+----------------+ 
| id    | int(11) | NO | PRI | NULL | auto_increment | 
| airport_id  | int(11) | NO | MUL | NULL |    | 
| zipcode   | char(5) | YES | MUL | NULL |    | 
| distance_in_miles | int(11) | YES | MUL | NULL |    | 
+-------------------+---------+------+-----+---------+----------------+ 

幫忙?!謝謝!

回答

0

這簡直就是如果我們在Airport定義一些範圍是這樣的:

class Airport < ActiveRecord::Base 
    scope :with_zipcode, -> (zipcode) { where(zipcode: zipcode) } 
    scope :in_distance, -> (miles) { 
    joins(:airport_zip_distances).where('airport_zip_distances.distance_in_miles < ?', miles) 
} 
end 

之後,我們可以:

  1. 查找與郵政編碼

    Airport.with_zipcode(12345) 
    
  2. 機場距離查找機場

    Airport.in_distance(5) 
    
  3. 查找與郵政編碼&距離機場

    Airport.with_zipcode(12345).in_distance(5)