我正在尝试使用活动记录查询机场之间可能的连接。我在这里的另一个问题中描述了我已经创建的模型:
基本上,我现在能做的是:
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")
不确定它是否是最好的解决方案,但它会产生我正在寻找的查询。
非常感谢大家!