0

我正在使用 Rails 3.2,并从 Foursquare 获取场地。我需要检查我返回的任何场地 ID 是否已在我的数据库中注册,然后返回该数组。我尝试以这种方式进行操作,但是对于所有不存在的场所,我得到了 nil (在数组中)。我的代码有什么问题,有没有更好的方法可以做到这一点,这样我就不必进行 20 次查询(每个 FQ 场地的数据库查询一次)。

def index
    client = Foursquare::Base.new(CLIENT_KEY, SECRET_KEY)
    @venues = client.venues.search(:ll => "-33.8670522, 151.1957362")

    output = @venues["nearby"].collect do |venue|
      account = Account.find_by_fq_venue (venue.id) if account.present?
    end

    render :json => output, :status => :success
  end

更新

我最终像这样解决它:

client = Foursquare::Base.new(CLIENT_KEY, SECRET_KEY)
    venues = client.venues.search(:ll => "-33.8670522, 151.1957362")
    ids = venues["nearby"].collect { |venue| venue.id }
    @output = Account.find_all_by_fq_venue (ids)
    render :json => @output, :status => :success
4

2 回答 2

1

改变

account = Account.find_by_fq_venue (venue.id) if account.present?

account = Account.find_by_fq_venue (venue.id) if Account.find_by_fq_venue (venue.id)

我只是在解释为什么account在分配给它的值之前使用它是错误的,因此你的 if 条件总是不满足,你得到一个 nil 的 aary。

更好的方法是改变

output = @venues["nearby"].collect do |venue|
  account = Account.find_by_fq_venue (venue.id) if account.present?
end

output = Account.find(:all, 
                 :conditions =>["fq_venue IN (?)", @venues["nearby"].map(&:id) ])

对于 Rails 3

output = Account.where(["fq_venue IN (?)", @venues["nearby"].map(&:id) ])
于 2012-10-12T10:26:52.020 回答
0

嗨,你试试这个。

帐户=[]

output = @venues["nearby"].collect do |venue|
  account << Account.find_by_fq_venue (venue.id) if !venue.id.nil?
end

现在在帐户数组中,您将获得所有行。

——维吉库马尔。

于 2012-10-12T10:55:03.740 回答