Rails 4下载到CSV

时间:2014-08-28 14:17:39

标签: ruby-on-rails csv

我正在构建一个市场应用程序,因此卖家可以列出要出售的商品。我试图通过卖家下载CSV,以便卖家可以下载自己的商家信息。

我正在关注此railscast中的代码。我得到了railscasts代码按原样工作。它将我模型中的所有数据下载到csv中。但是,当我向查询添加卖方过滤器时,它不会应用过滤器。

在listing_controller中:

def index
  @listings = Listing.not_expired.order("created_at DESC")  
    respond_to do |format|
      format.html
      format.csv { send_data @listings.to_csv }   
    end
end

def seller
  @listings = Listing.where(user: current_user).order("created_at DESC")
  respond_to do |format|
    format.html
    format.csv { send_data @listings.seller_csv }  
  end
end

在listing.rb中:

def self.to_csv
  CSV.generate do |csv|
    csv << column_names
    all.each do |listing|
      csv << listing.attributes.values_at(*column_names)
    end
  end
end

def self.seller_csv
  CSV.generate do |csv|
    csv << column_names
    where(user: current_user).each do |listing|
      csv << listing.attributes.values_at(*column_names)
    end
  end
end

to_csv方法运行正常并下载所有列表。但seller_csv方法也会下载所有列表。我需要它来过滤current_user。我错过了什么?

1 个答案:

答案 0 :(得分:2)

让您的函数将列表列表作为参数。

def self.to_csv(listings)
  CSV.generate do |csv|
    csv << column_names
    listings.each do |listing|
      csv << listing.attributes.values_at(*column_names)
    end
  end
end

然后你可以在两个场景中重复使用相同的功能

def index
  @listings = Listing.not_expired.order("created_at DESC")  
    respond_to do |format|
      format.html
      format.csv { send_data Listing.to_csv(@listings) }   
    end
end

def seller
  @listings = Listing.where(user: current_user).order("created_at DESC")
  respond_to do |format|
    format.html
    format.csv { send_data Listing.to_csv(@listings) }  
  end
end

您的代码没有真正意义,因为您在控制器中获取列表但从未重新使用这些获取的对象,并且在模型的静态函数中重新调用DB。