1

我正在尝试使用活动记录查询机场之间可能的连接。我在这里的另一个问题中描述了我已经创建的模型:

n:m 自加入 ruby​​ on rails 活动记录

基本上,我现在能做的是:

ny = Airport.create({"city" => "New York"})
la = Airport.create({"city" => "Los Angeles"})

ny.destinations << la
la.destinations << ny

我在查询我正在寻找的数据时遇到了一个问题,这在 SQL 中非常简单,但我对活动记录还没有运气。

ny = Airport.where('city = ?', 'New York')
ny.destinations

返回正确的对象,但所有对象。

SQL 查询如下所示:

 SELECT "airports".* FROM "airports" INNER JOIN "connections" ON "airports"."id" = "connections"."destination_id" WHERE "connections"."airport_id" = 3

例如,我想按以“s”开头的城市过滤这些结果,因此 SQL 查询可能如下所示:

SELECT "airports".* FROM "airports" INNER JOIN "connections" ON "airports"."id" = "connections"."destination_id" WHERE "connections"."airport_id" = 3 AND airports"."city" LIKE "s%"

我试过这样:

ny.destinations.where('city LIKE ?', '#{params[:query]}%')

但我总是得到一个空的结果。

我如何使用活动记录来过滤我的结果对象?

编辑:这是我迄今为止找到的最佳解决方案:

我在 Airport 模型中添加了 cityLike() 方法:

应用程序/模型/airport.rb:

class Airport < ActiveRecord::Base
  attr_accessible :city, :name

  has_many :connections
  has_many :destinations, :through => :connections
  has_many :inverse_connections, :class_name => "Connection", :foreign_key => "destination_id"
  has_many :inverse_destinations, :through => :inverse_connections, :source => :airport

  def self.cityLike(query)
    where("city LIKE ?", "%#{query}%")
  end
end

应用程序/模型/connection.rb:

class Connection < ActiveRecord::Base
  attr_accessible :destination_id, :airport_id

  belongs_to :airport
  belongs_to :destination, :class_name => "Airport"
end

现在我可以使用以下语句查询对象:

Airport.find(1).destinations.cityLike("a")

不确定它是否是最好的解决方案,但它会产生我正在寻找的查询。

非常感谢大家!

4

3 回答 3

0

那这个呢?

Airport.find(:all, joins: "INNER JOIN `connections` ON airports.id = connections.destination_id").where("connections.airport_id = ? AND airports.city LIKE ?", ny_id, "s%")
于 2013-05-07T20:18:46.977 回答
0

这段代码:

ny.destinations.where('city LIKE ?', '#{params[:query]}%')

像这样工作——首先你有一个代表纽约市的对象。当您说“.destinations”时,您现在已经遵循您在模型中定义的关系来检索您可以从纽约到达的所有目的地。但是,如果我正确地想象您的数据库架构,这些目的地实际上并没有一个名为“城市”的字段;相反,他们有一个destination_id,它将目的地与特定机场联系起来,并且它是与城市相关联的机场。

因此,当您在目标表中查询“city LIKE?”时,它没有找到任何匹配的记录。

相反,尝试

ny.destinations.joins(:airports).where('city LIKE ?', '#{params[:query]}%')
于 2013-05-07T21:06:46.443 回答
0

ActiveRecord::Base.execute( sql )允许您使用纯 SQL 进行查询并返回相关模型。

于 2013-05-07T20:05:10.760 回答