A Class of Active record pattern for TSV/CSV
data/users.tsv
id name age
1 ksss 30
2 foo 29
3 bar 30
data/nicknames.tsv
id user_id nickname
1 1 yuki
2 1 kuri
3 1 k
4 2 f
require 'active_tsv'
class User < ActiveTsv::Base
self.table_path = "data/users.tsv" # required
# self.encoding = Encoding::Shift_JIS # optional
# self.primary_key = "uid" # optional
has_many :nicknames
end
class Nickname < ActiveTsv::Base
self.table_path = "data/nicknames.tsv"
belongs_to :user
end
User.all
=> #<ActiveTsv::Relation [#<User id: "1", name: "ksss", age: "30">, #<User id: "2", name: "foo", age: "29">, #<User id: "3", name: "bar", age: "30">]>
User.all.to_a
=> [#<User id: "1", name: "ksss", age: "30">, #<User id: "2", name: "foo", age: "29">, #<User id: "3", name: "bar", age: "30">]
User.first
#=> #<User id: "1", name: "ksss", age: "30">
User.last
#=> #<User id: "3", name: "bar", age: "30">
User.where(age: 30).each do |user|
user.name #=> "ksss", "bar"
end
User.where(age: 30).to_a
#=> [#<User id: "1", name: "ksss", age: "30">, #<User id: "3", name: "bar", age: "30">]
User.where(age: 30).last
#=> #<User id: "3", name: "bar", age: "30">
User.where(age: 30).where(name: "ksss").first
#=> #<User id: "1", name: "ksss", age: "30">
User.where(id: [1, 2]).to_a
#=> [#<User id: "1", name: "ksss", age: "30">, #<User id: "2", name: "foo", age: "29">]
User.where.not(name: "ksss").first
#=> #<User id: "2", name: "foo", age: "29">
User.group(:age).count
#=> {"30"=>2, "29"=>1}
User.order(:name).to_a
#=> [#<User id: "3", name: "bar", age: "30">, #<User id: "2", name: "foo", age: "29">, #<User id: "1", name: "ksss", age: "30">]
User.order(name: :desc).to_a
=> [#<User id: "1", name: "ksss", age: "30">, #<User id: "2", name: "foo", age: "29">, #<User id: "3", name: "bar", age: "30">]
User.first.nicknames
#=> #<ActiveTsv::Relation [#<Nickname id: "1", user_id: "1", nickname: "yuki">, #<Nickname id: "2", user_id: "1", nickname: "kuri">, #<Nickname id: "3", user_id: "1", nickname: "k">]>
Nickname.last.user
#=> #<User id: "2", name: "foo", age: "29">
Also Supported CSV.
require 'active_csv'
class User < ActiveCsv::Base
self.table_path = "data/users.csv"
end
Support all methods of ActiveRecord
Add this line to your application's Gemfile:
gem 'active_tsv'
And then execute:
$ bundle
Or install it yourself as:
$ gem install active_tsv
The gem is available as open source under the terms of the MIT License.