148 lines
3.5 KiB
Ruby
148 lines
3.5 KiB
Ruby
require 'active_record'
|
|
|
|
case ENV['DB']
|
|
when "mysql"
|
|
ActiveRecord::Base.establish_connection(
|
|
adapter: 'mysql2',
|
|
database: 'ransack',
|
|
encoding: 'utf8'
|
|
)
|
|
when "postgres"
|
|
ActiveRecord::Base.establish_connection(
|
|
adapter: 'postgresql',
|
|
database: 'ransack',
|
|
username: 'postgres',
|
|
min_messages: 'warning'
|
|
)
|
|
else
|
|
# Assume SQLite3
|
|
ActiveRecord::Base.establish_connection(
|
|
adapter: 'sqlite3',
|
|
database: ':memory:'
|
|
)
|
|
end
|
|
|
|
class Person < ActiveRecord::Base
|
|
default_scope { order(id: :desc) }
|
|
belongs_to :parent, class_name: 'Person', foreign_key: :parent_id
|
|
has_many :children, class_name: 'Person', foreign_key: :parent_id
|
|
has_many :articles
|
|
has_many :comments
|
|
has_many :authored_article_comments, through: :articles,
|
|
source: :comments, foreign_key: :person_id
|
|
has_many :notes, as: :notable
|
|
|
|
ransacker :reversed_name, formatter: proc { |v| v.reverse } do |parent|
|
|
parent.table[:name]
|
|
end
|
|
|
|
ransacker :doubled_name do |parent|
|
|
Arel::Nodes::InfixOperation.new(
|
|
'||', parent.table[:name], parent.table[:name]
|
|
)
|
|
end
|
|
|
|
def self.ransackable_attributes(auth_object = nil)
|
|
if auth_object == :admin
|
|
column_names + _ransackers.keys - ['only_sort']
|
|
else
|
|
column_names + _ransackers.keys - ['only_sort', 'only_admin']
|
|
end
|
|
end
|
|
|
|
def self.ransortable_attributes(auth_object = nil)
|
|
if auth_object == :admin
|
|
column_names + _ransackers.keys - ['only_search']
|
|
else
|
|
column_names + _ransackers.keys - ['only_search', 'only_admin']
|
|
end
|
|
end
|
|
end
|
|
|
|
class Article < ActiveRecord::Base
|
|
belongs_to :person
|
|
has_many :comments
|
|
has_and_belongs_to_many :tags
|
|
has_many :notes, as: :notable
|
|
end
|
|
|
|
class Comment < ActiveRecord::Base
|
|
belongs_to :article
|
|
belongs_to :person
|
|
end
|
|
|
|
class Tag < ActiveRecord::Base
|
|
has_and_belongs_to_many :articles
|
|
end
|
|
|
|
class Note < ActiveRecord::Base
|
|
belongs_to :notable, polymorphic: true
|
|
end
|
|
|
|
module Schema
|
|
def self.create
|
|
ActiveRecord::Migration.verbose = false
|
|
|
|
ActiveRecord::Schema.define do
|
|
create_table :people, force: true do |t|
|
|
t.integer :parent_id
|
|
t.string :name
|
|
t.string :email
|
|
t.string :only_search
|
|
t.string :only_sort
|
|
t.string :only_admin
|
|
t.integer :salary
|
|
t.boolean :awesome, default: false
|
|
t.timestamps
|
|
end
|
|
|
|
create_table :articles, force: true do |t|
|
|
t.integer :person_id
|
|
t.string :title
|
|
t.text :body
|
|
end
|
|
|
|
create_table :comments, force: true do |t|
|
|
t.integer :article_id
|
|
t.integer :person_id
|
|
t.text :body
|
|
end
|
|
|
|
create_table :tags, force: true do |t|
|
|
t.string :name
|
|
end
|
|
|
|
create_table :articles_tags, force: true, id: false do |t|
|
|
t.integer :article_id
|
|
t.integer :tag_id
|
|
end
|
|
|
|
create_table :notes, force: true do |t|
|
|
t.integer :notable_id
|
|
t.string :notable_type
|
|
t.string :note
|
|
end
|
|
end
|
|
|
|
10.times do
|
|
person = Person.make
|
|
Note.make(notable: person)
|
|
3.times do
|
|
article = Article.make(person: person)
|
|
3.times do
|
|
article.tags = [Tag.make, Tag.make, Tag.make]
|
|
end
|
|
Note.make(notable: article)
|
|
10.times do
|
|
Comment.make(article: article, person: person)
|
|
end
|
|
end
|
|
end
|
|
|
|
Comment.make(
|
|
body: 'First post!', article: Article.make(title: 'Hello, world!')
|
|
)
|
|
|
|
end
|
|
end
|