Some clean up
This commit is contained in:
parent
3676068fd9
commit
cf8ec8da6e
|
@ -21,7 +21,7 @@ class ApplicationController < ActionController::Base
|
||||||
def configure_permitted_parameters
|
def configure_permitted_parameters
|
||||||
devise_parameter_sanitizer.for(:sign_up) { |u| u.permit(
|
devise_parameter_sanitizer.for(:sign_up) { |u| u.permit(
|
||||||
:nickname, :name, :last_name, :password, :password_confirmation,
|
:nickname, :name, :last_name, :password, :password_confirmation,
|
||||||
:current_password, :avatar
|
:avatar
|
||||||
) }
|
) }
|
||||||
|
|
||||||
devise_parameter_sanitizer.for(:account_update) { |u| u.permit(
|
devise_parameter_sanitizer.for(:account_update) { |u| u.permit(
|
||||||
|
|
|
@ -5,10 +5,10 @@ class OrdersController < ApplicationController
|
||||||
@user = User.find(params[:user_id])
|
@user = User.find(params[:user_id])
|
||||||
@order = @user.orders.build
|
@order = @user.orders.build
|
||||||
@products = Product.all
|
@products = Product.all
|
||||||
@order_products = @order.order_products
|
@order_items = @order.order_items
|
||||||
|
|
||||||
@products.each do |p|
|
@products.each do |p|
|
||||||
@order_products.build(product: p)
|
@order_items.build(product: p)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -16,7 +16,7 @@ class OrdersController < ApplicationController
|
||||||
@user = User.find(params[:user_id])
|
@user = User.find(params[:user_id])
|
||||||
@order = @user.orders.build(order_params)
|
@order = @user.orders.build(order_params)
|
||||||
@products = Product.all
|
@products = Product.all
|
||||||
@order_products = @order.order_products
|
@order_items = @order.order_items
|
||||||
|
|
||||||
if @order.save
|
if @order.save
|
||||||
flash[:success] = "#{@order.to_sentence} ordered. Enjoy it!"
|
flash[:success] = "#{@order.to_sentence} ordered. Enjoy it!"
|
||||||
|
@ -57,6 +57,6 @@ class OrdersController < ApplicationController
|
||||||
private
|
private
|
||||||
|
|
||||||
def order_params
|
def order_params
|
||||||
params.require(:order).permit(order_products_attributes: [:count, product_attributes: [:id, :price, :stock]])
|
params.require(:order).permit(order_items_attributes: [:count, product_attributes: [:id, :price, :stock]])
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -4,8 +4,8 @@ class UsersController < ApplicationController
|
||||||
def show
|
def show
|
||||||
@user = User.find_by_id(params[:id]) || current_user
|
@user = User.find_by_id(params[:id]) || current_user
|
||||||
@orders = @user.orders.includes(:products).paginate(page: params[:page])
|
@orders = @user.orders.includes(:products).paginate(page: params[:page])
|
||||||
@products = @user.products.select("products.*", "sum(order_products.count) as count").group(:product_id)
|
@products = @user.products.select("products.*", "sum(order_items.count) as count").group(:product_id)
|
||||||
@categories = @user.products.select("products.category", "sum(order_products.count) as count").group(:category)
|
@categories = @user.products.select("products.category", "sum(order_items.count) as count").group(:category)
|
||||||
end
|
end
|
||||||
|
|
||||||
def index
|
def index
|
||||||
|
|
|
@ -13,27 +13,27 @@ class Order < ActiveRecord::Base
|
||||||
include ActionView::Helpers::TextHelper
|
include ActionView::Helpers::TextHelper
|
||||||
|
|
||||||
after_initialize { self.total_price = 0 }
|
after_initialize { self.total_price = 0 }
|
||||||
after_create { self.user.pay(price) }
|
after_create { self.user.increment!(:balance_cents, -price) }
|
||||||
before_destroy { self.user.pay(-price) }
|
before_destroy { self.user.increment!(:balance_cents, price) }
|
||||||
|
|
||||||
belongs_to :user, counter_cache: true
|
belongs_to :user, counter_cache: true
|
||||||
has_many :order_products, dependent: :destroy
|
has_many :order_items, dependent: :destroy
|
||||||
has_many :products, through: :order_products
|
has_many :products, through: :order_items
|
||||||
|
|
||||||
attr_accessor :total_price
|
attr_accessor :total_price
|
||||||
|
|
||||||
validates :user, presence: true
|
validates :user, presence: true
|
||||||
validates :order_products, presence: true, in_stock: true
|
validates :order_items, presence: true, in_stock: true
|
||||||
|
|
||||||
accepts_nested_attributes_for :order_products, reject_if: proc { |op| op[:count].to_i <= 0 }
|
accepts_nested_attributes_for :order_items, reject_if: proc { |oi| oi[:count].to_i <= 0 }
|
||||||
|
|
||||||
def price
|
def price
|
||||||
self.order_products.map{ |op| op.count * op.product.price_cents }.sum
|
self.order_items.map{ |oi| oi.count * oi.product.price_cents }.sum
|
||||||
end
|
end
|
||||||
|
|
||||||
def to_sentence
|
def to_sentence
|
||||||
self.order_products.map {
|
self.order_items.map {
|
||||||
|op| pluralize(op.count, op.product.name)
|
|oi| pluralize(oi.count, oi.product.name)
|
||||||
}.to_sentence
|
}.to_sentence
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -1,22 +1,22 @@
|
||||||
# == Schema Information
|
# == Schema Information
|
||||||
#
|
#
|
||||||
# Table name: order_products
|
# Table name: order_items
|
||||||
#
|
#
|
||||||
# id :integer not null, primary key
|
# id :integer not null, primary key
|
||||||
# order_id :integer
|
# order_id :integer not null
|
||||||
# product_id :integer
|
# product_id :integer not null
|
||||||
# count :integer default(1)
|
# count :integer default(0)
|
||||||
#
|
#
|
||||||
|
|
||||||
class OrderProduct < ActiveRecord::Base
|
class OrderItem < ActiveRecord::Base
|
||||||
after_create :remove_from_stock
|
|
||||||
before_destroy :put_back_in_stock
|
|
||||||
|
|
||||||
belongs_to :order
|
belongs_to :order
|
||||||
belongs_to :product
|
belongs_to :product
|
||||||
|
|
||||||
validates :product, presence: true
|
validates :product, presence: true
|
||||||
validates :count, numericality: { greater_than_or_equal_to: 0 }
|
validates :count, numericality: { only_integer: true, greater_than_or_equal_to: 0 }
|
||||||
|
|
||||||
|
after_create :remove_from_stock
|
||||||
|
before_destroy :put_back_in_stock
|
||||||
|
|
||||||
accepts_nested_attributes_for :product
|
accepts_nested_attributes_for :product
|
||||||
|
|
||||||
|
@ -28,12 +28,10 @@ class OrderProduct < ActiveRecord::Base
|
||||||
private
|
private
|
||||||
|
|
||||||
def remove_from_stock
|
def remove_from_stock
|
||||||
product.stock -= self.count
|
product.increment!(:stock, - self.count)
|
||||||
product.save
|
|
||||||
end
|
end
|
||||||
|
|
||||||
def put_back_in_stock
|
def put_back_in_stock
|
||||||
product.stock += self.count
|
product.increment!(:stock, self.count)
|
||||||
product.save
|
|
||||||
end
|
end
|
||||||
end
|
end
|
|
@ -3,20 +3,20 @@
|
||||||
# Table name: products
|
# Table name: products
|
||||||
#
|
#
|
||||||
# id :integer not null, primary key
|
# id :integer not null, primary key
|
||||||
# name :string(255)
|
# name :string(255) not null
|
||||||
# price_cents :integer
|
# price_cents :integer default(0), not null
|
||||||
# created_at :datetime
|
# category :integer default(0)
|
||||||
# updated_at :datetime
|
# stock :integer default(0), not null
|
||||||
# avatar_file_name :string(255)
|
# avatar_file_name :string(255)
|
||||||
# avatar_content_type :string(255)
|
# avatar_content_type :string(255)
|
||||||
# avatar_file_size :integer
|
# avatar_file_size :integer
|
||||||
# avatar_updated_at :datetime
|
# avatar_updated_at :datetime
|
||||||
# category :integer default(0)
|
# created_at :datetime
|
||||||
# stock :integer default(0)
|
# updated_at :datetime
|
||||||
#
|
#
|
||||||
|
|
||||||
class Product < ActiveRecord::Base
|
class Product < ActiveRecord::Base
|
||||||
has_many :order_products
|
has_many :order_items
|
||||||
has_attached_file :avatar, styles: { medium: "100x100>" }, default_style: :medium
|
has_attached_file :avatar, styles: { medium: "100x100>" }, default_style: :medium
|
||||||
|
|
||||||
enum category: %w(food beverages other)
|
enum category: %w(food beverages other)
|
||||||
|
@ -27,12 +27,11 @@ class Product < ActiveRecord::Base
|
||||||
validates_attachment :avatar, presence: true, content_type: { content_type: ["image/jpeg", "image/gif", "image/png"] }
|
validates_attachment :avatar, presence: true, content_type: { content_type: ["image/jpeg", "image/gif", "image/png"] }
|
||||||
|
|
||||||
def price
|
def price
|
||||||
(price_cents || 0) / 100.0
|
self.price_cents / 100.0
|
||||||
end
|
end
|
||||||
|
|
||||||
def price=(value)
|
def price=(value)
|
||||||
if value.is_a? String then value.sub!(',', '.') end
|
if value.is_a? String then value.sub!(',', '.') end
|
||||||
self.price_cents = (value.to_f * 100).to_int
|
self.price_cents = (value.to_f * 100).to_int
|
||||||
end
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
|
@ -5,8 +5,16 @@
|
||||||
# id :integer not null, primary key
|
# id :integer not null, primary key
|
||||||
# name :string(255)
|
# name :string(255)
|
||||||
# last_name :string(255)
|
# last_name :string(255)
|
||||||
# balance :integer default(0)
|
# balance_cents :integer default(0), not null
|
||||||
# nickname :string(255)
|
# nickname :string(255)
|
||||||
|
# admin :boolean
|
||||||
|
# koelkast :boolean default(FALSE)
|
||||||
|
# dagschotel_id :integer
|
||||||
|
# orders_count :integer default(0)
|
||||||
|
# avatar_file_name :string(255)
|
||||||
|
# avatar_content_type :string(255)
|
||||||
|
# avatar_file_size :integer
|
||||||
|
# avatar_updated_at :datetime
|
||||||
# created_at :datetime
|
# created_at :datetime
|
||||||
# updated_at :datetime
|
# updated_at :datetime
|
||||||
# encrypted_password :string(255) default(""), not null
|
# encrypted_password :string(255) default(""), not null
|
||||||
|
@ -16,21 +24,14 @@
|
||||||
# last_sign_in_at :datetime
|
# last_sign_in_at :datetime
|
||||||
# current_sign_in_ip :string(255)
|
# current_sign_in_ip :string(255)
|
||||||
# last_sign_in_ip :string(255)
|
# last_sign_in_ip :string(255)
|
||||||
# admin :boolean
|
|
||||||
# dagschotel_id :integer
|
|
||||||
# avatar_file_name :string(255)
|
|
||||||
# avatar_content_type :string(255)
|
|
||||||
# avatar_file_size :integer
|
|
||||||
# avatar_updated_at :datetime
|
|
||||||
# orders_count :integer default(0)
|
|
||||||
# koelkast :boolean default(FALSE)
|
|
||||||
#
|
#
|
||||||
|
|
||||||
class User < ActiveRecord::Base
|
class User < ActiveRecord::Base
|
||||||
devise :database_authenticatable, :registerable, :rememberable, :trackable
|
devise :database_authenticatable, :registerable, :rememberable, :trackable, :validatable
|
||||||
|
|
||||||
has_paper_trail only: [:balance, :admin, :orders_count, :koelkast]
|
has_paper_trail only: [:balance, :admin, :orders_count, :koelkast]
|
||||||
has_attached_file :avatar, styles: { medium: "100x100>" }, default_style: :medium,
|
|
||||||
default_url: "http://babeholder.pixoil.com/img/70/70"
|
has_attached_file :avatar, styles: { medium: "100x100>" }, default_style: :medium
|
||||||
|
|
||||||
has_many :orders, -> { includes :products }
|
has_many :orders, -> { includes :products }
|
||||||
has_many :products, through: :orders
|
has_many :products, through: :orders
|
||||||
|
@ -39,7 +40,6 @@ class User < ActiveRecord::Base
|
||||||
validates :nickname, presence: true, uniqueness: true
|
validates :nickname, presence: true, uniqueness: true
|
||||||
validates :name, presence: true
|
validates :name, presence: true
|
||||||
validates :last_name, presence: true
|
validates :last_name, presence: true
|
||||||
validates :password, length: { in: 8..128 }, confirmation: true, on: :create
|
|
||||||
validates_attachment :avatar, presence: true, content_type: { content_type: ["image/jpeg", "image/gif", "image/png"] }
|
validates_attachment :avatar, presence: true, content_type: { content_type: ["image/jpeg", "image/gif", "image/png"] }
|
||||||
|
|
||||||
scope :members, -> { where koelkast: false }
|
scope :members, -> { where koelkast: false }
|
||||||
|
@ -48,17 +48,28 @@ class User < ActiveRecord::Base
|
||||||
"#{name} #{last_name}"
|
"#{name} #{last_name}"
|
||||||
end
|
end
|
||||||
|
|
||||||
def pay(amount)
|
|
||||||
write_attribute(:balance, read_attribute(:balance) - amount)
|
|
||||||
self.save
|
|
||||||
end
|
|
||||||
|
|
||||||
def balance
|
def balance
|
||||||
(read_attribute(:balance) || 0) / 100.0
|
self.balance_cents / 100.0
|
||||||
end
|
end
|
||||||
|
|
||||||
def balance=(value)
|
def balance=(value)
|
||||||
if value.is_a? String then value.sub!(',', '.') end
|
if value.is_a? String then value.sub!(',', '.') end
|
||||||
write_attribute(:balance, (value.to_f * 100).to_int)
|
self.balance_cents = (value.to_f * 100).to_int
|
||||||
|
end
|
||||||
|
|
||||||
|
# Change URL params for User
|
||||||
|
|
||||||
|
def to_param
|
||||||
|
"#{id} #{nickname}".parameterize
|
||||||
|
end
|
||||||
|
|
||||||
|
# This is needed so Devise doesn't try to validate :email
|
||||||
|
|
||||||
|
def email_required?
|
||||||
|
false
|
||||||
|
end
|
||||||
|
|
||||||
|
def email_changed?
|
||||||
|
false
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
class InStockValidator < ActiveModel::Validator
|
class InStockValidator < ActiveModel::Validator
|
||||||
def validate(record)
|
def validate(record)
|
||||||
record.order_products.each do |op|
|
record.order_items.each do |oi|
|
||||||
record.errors[op.product.name] = "is not in stock anymore" if op.count > op.product.stock
|
record.errors[oi.product.name] = "is not in stock anymore" if oi.count > oi.product.stock
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -3,7 +3,6 @@
|
||||||
|
|
||||||
<div class="sign-in">
|
<div class="sign-in">
|
||||||
<%= f_form_for(resource, :as => resource_name, :url => session_path(resource_name)) do |f| %>
|
<%= f_form_for(resource, :as => resource_name, :url => session_path(resource_name)) do |f| %>
|
||||||
|
|
||||||
<%= f.text_field :nickname %>
|
<%= f.text_field :nickname %>
|
||||||
<%= f.password_field :password %>
|
<%= f.password_field :password %>
|
||||||
|
|
||||||
|
|
15
app/views/order_items/_order_item.html.erb
Normal file
15
app/views/order_items/_order_item.html.erb
Normal file
|
@ -0,0 +1,15 @@
|
||||||
|
<div class="col-md-3 form_products">
|
||||||
|
<div class="thumbnail ">
|
||||||
|
<div class="form_row center">
|
||||||
|
<%= image_tag product.avatar %>
|
||||||
|
<div class="caption">
|
||||||
|
<%= content_tag :h3, "#{product.name} - #{euro(product.price)}" %>
|
||||||
|
<%= f.counter :count, skip_label: true, wrapper_class: "input-group", class: "row_counter" %>
|
||||||
|
<%= f.fields_for :product do |product| %>
|
||||||
|
<%= product.hidden_field :price_cents, class: :price %>
|
||||||
|
<%= product.hidden_field :stock, class: :stock %>
|
||||||
|
<% end %>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
|
@ -1,17 +0,0 @@
|
||||||
<div class="col-md-3 form_products">
|
|
||||||
<div class="thumbnail ">
|
|
||||||
<div class="form_row center">
|
|
||||||
<%= image_tag product.avatar %>
|
|
||||||
<div class="caption">
|
|
||||||
<h3><%= product.name %> - <%= content_tag :span, euro(product.price) %></h3>
|
|
||||||
<p>
|
|
||||||
<%= f.counter :count, skip_label: true, wrapper_class: "input-group", class: "row_counter" %>
|
|
||||||
<%= f.fields_for :product do |product| %>
|
|
||||||
<%= product.hidden_field :price_cents, class: :price %>
|
|
||||||
<%= product.hidden_field :stock, class: :stock %>
|
|
||||||
<% end %>
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
|
@ -1,2 +1,2 @@
|
||||||
<%= order.created_at %>
|
<%= order.created_at %>
|
||||||
<%= simple_format(order.order_products.map { |p| pluralize(p.count, p.product.name) }.to_sentence) %>
|
<%= simple_format(order.to_sentence) %>
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
<div class="col-md-6">
|
<div class="col-md-6">
|
||||||
<h3 class="center" >sort by name</h3>
|
<h3 class="center" >Sort by name</h3>
|
||||||
<% users.each do |user| %>
|
<% users.each do |user| %>
|
||||||
<%= render 'users/new_order', user: user %>
|
<%= render 'users/new_order', user: user %>
|
||||||
<% end %>
|
<% end %>
|
||||||
|
|
|
@ -1,15 +1,15 @@
|
||||||
<h3>Order for <%= @user.nickname %> (<%= euro(@user.balance) %>)</h3>
|
<h3>Order for <%= @user.nickname %> (<%= euro(@user.balance) %>)</h3>
|
||||||
|
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<%= form_for @order, builder: FormattedFormBuilder, url: user_orders_path(@user) do |f| %>
|
<%= f_form_for [@user, @order] do |f| %>
|
||||||
<%= f.error_messages %>
|
<%= f.error_messages %>
|
||||||
|
|
||||||
<div class="col-md-12">
|
<div class="col-md-12">
|
||||||
<%= f.fields_for :order_products do |op_field| %>
|
<%= f.fields_for :order_items do |op_field| %>
|
||||||
<%= render op_field.object, f: op_field, product: op_field.object.product %>
|
<%= render op_field.object, f: op_field, product: op_field.object.product %>
|
||||||
<% end %>
|
<% end %>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<%= render 'order_products/total_price', f: f %>
|
<%= render 'order_items/total_price', f: f %>
|
||||||
<% end %>
|
<% end %>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col-md-6 col-md-offset-3 sign-in">
|
<div class="col-md-6 col-md-offset-3 sign-in">
|
||||||
<%= form_for @product, builder: FormattedFormBuilder, html: { multipart: true } do |f| %>
|
<%= f_form_for @product, html: { multipart: true } do |f| %>
|
||||||
<%= f.error_messages %>
|
<%= f.error_messages %>
|
||||||
|
|
||||||
<%= f.text_field :name %>
|
<%= f.text_field :name %>
|
||||||
|
|
|
@ -1 +0,0 @@
|
||||||
<%= simple_format(pluralize(product.count, product.name)) %>
|
|
|
@ -1,7 +1,10 @@
|
||||||
<div class="thumbnail overview">
|
<div class="thumbnail overview">
|
||||||
<%= link_to image_tag(user.dagschotel.avatar, class: "img-circle dagschotel"), user_quickpay_path(user) unless user.dagschotel.nil? %>
|
<% unless user.dagschotel.nil? %>
|
||||||
<%= link_to image_tag(user.avatar , class: "img-circle avatar"), new_user_order_path(user) %>
|
<%= link_to user_quickpay_path(user) do %>
|
||||||
|
<%= image_tag user.dagschotel.avatar, class: "img-circle dagschotel" %>
|
||||||
|
<% end %>
|
||||||
|
<% end %>
|
||||||
|
|
||||||
<%= link_to user.name , new_user_order_path(user), class: "btn btn-info",
|
<%= link_to image_tag(user.avatar , class: "img-circle avatar"), new_user_order_path(user) %>
|
||||||
style: get_color_style(user) %>
|
<%= link_to user.name , new_user_order_path(user), class: "btn btn-info", style: get_color_style(user) %>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -227,7 +227,7 @@ Devise.setup do |config|
|
||||||
# config.navigational_formats = ['*/*', :html]
|
# config.navigational_formats = ['*/*', :html]
|
||||||
|
|
||||||
# The default HTTP method used to sign out a resource. Default is :delete.
|
# The default HTTP method used to sign out a resource. Default is :delete.
|
||||||
config.sign_out_via = :delete
|
config.sign_out_via = :get
|
||||||
|
|
||||||
# ==> OmniAuth
|
# ==> OmniAuth
|
||||||
# Add a new OmniAuth provider. Check the wiki for more information on setting
|
# Add a new OmniAuth provider. Check the wiki for more information on setting
|
||||||
|
|
|
@ -23,6 +23,7 @@ Rails.application.routes.draw do
|
||||||
post 'stock' => 'products#update_stock', as: 'update_stock'
|
post 'stock' => 'products#update_stock', as: 'update_stock'
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
get 'admins' => 'admins#schulden', as: "admins_schulden"
|
get 'admins' => 'admins#schulden', as: "admins_schulden"
|
||||||
get 'overview' => 'orders#overview', as: "orders"
|
get 'overview' => 'orders#overview', as: "orders"
|
||||||
end
|
end
|
||||||
|
|
|
@ -0,0 +1,5 @@
|
||||||
|
class ChangeOrderProductToOrderItem < ActiveRecord::Migration
|
||||||
|
def change
|
||||||
|
rename_table :order_products, :order_items
|
||||||
|
end
|
||||||
|
end
|
|
@ -0,0 +1,5 @@
|
||||||
|
class ChangeBalanceToBalanceCents < ActiveRecord::Migration
|
||||||
|
def change
|
||||||
|
rename_column :users, :balance, :balance_cents
|
||||||
|
end
|
||||||
|
end
|
5
db/migrate/20150209141047_add_not_null_balance_users.rb
Normal file
5
db/migrate/20150209141047_add_not_null_balance_users.rb
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
class AddNotNullBalanceUsers < ActiveRecord::Migration
|
||||||
|
def change
|
||||||
|
change_column :users, :balance_cents, :integer, default: 0, null: false
|
||||||
|
end
|
||||||
|
end
|
8
db/migrate/20150209141337_add_index_on_koelkast.rb
Normal file
8
db/migrate/20150209141337_add_index_on_koelkast.rb
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
class AddIndexOnKoelkast < ActiveRecord::Migration
|
||||||
|
def change
|
||||||
|
add_index :users, :koelkast
|
||||||
|
add_index :users, :orders_count
|
||||||
|
change_column :products, :price_cents, :integer, default: 0, null: false
|
||||||
|
change_column :products, :stock, :integer, default: 0, null: false
|
||||||
|
end
|
||||||
|
end
|
6
db/migrate/20150209144839_not_null_fields.rb
Normal file
6
db/migrate/20150209144839_not_null_fields.rb
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
class NotNullFields < ActiveRecord::Migration
|
||||||
|
def change
|
||||||
|
change_column :order_items, :product_id, :integer, null: false
|
||||||
|
change_column :order_items, :order_id, :integer, null: false
|
||||||
|
end
|
||||||
|
end
|
5
db/migrate/20150209145303_products_name_presence_true.rb
Normal file
5
db/migrate/20150209145303_products_name_presence_true.rb
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
class ProductsNamePresenceTrue < ActiveRecord::Migration
|
||||||
|
def change
|
||||||
|
change_column :products, :name, :string, null: false
|
||||||
|
end
|
||||||
|
end
|
41
db/schema.rb
41
db/schema.rb
|
@ -11,11 +11,11 @@
|
||||||
#
|
#
|
||||||
# It's strongly recommended that you check this file into your version control system.
|
# It's strongly recommended that you check this file into your version control system.
|
||||||
|
|
||||||
ActiveRecord::Schema.define(version: 20150209113630) do
|
ActiveRecord::Schema.define(version: 20150209145303) do
|
||||||
|
|
||||||
create_table "order_products", force: true do |t|
|
create_table "order_items", force: true do |t|
|
||||||
t.integer "order_id"
|
t.integer "order_id", null: false
|
||||||
t.integer "product_id"
|
t.integer "product_id", null: false
|
||||||
t.integer "count", default: 0
|
t.integer "count", default: 0
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -30,23 +30,31 @@ ActiveRecord::Schema.define(version: 20150209113630) do
|
||||||
add_index "orders", ["user_id"], name: "index_orders_on_user_id"
|
add_index "orders", ["user_id"], name: "index_orders_on_user_id"
|
||||||
|
|
||||||
create_table "products", force: true do |t|
|
create_table "products", force: true do |t|
|
||||||
t.string "name"
|
t.string "name", null: false
|
||||||
t.integer "price_cents"
|
t.integer "price_cents", default: 0, null: false
|
||||||
t.datetime "created_at"
|
t.integer "category", default: 0
|
||||||
t.datetime "updated_at"
|
t.integer "stock", default: 0, null: false
|
||||||
t.string "avatar_file_name"
|
t.string "avatar_file_name"
|
||||||
t.string "avatar_content_type"
|
t.string "avatar_content_type"
|
||||||
t.integer "avatar_file_size"
|
t.integer "avatar_file_size"
|
||||||
t.datetime "avatar_updated_at"
|
t.datetime "avatar_updated_at"
|
||||||
t.integer "category", default: 0
|
t.datetime "created_at"
|
||||||
t.integer "stock", default: 0
|
t.datetime "updated_at"
|
||||||
end
|
end
|
||||||
|
|
||||||
create_table "users", force: true do |t|
|
create_table "users", force: true do |t|
|
||||||
t.string "name"
|
t.string "name"
|
||||||
t.string "last_name"
|
t.string "last_name"
|
||||||
t.integer "balance", default: 0
|
t.integer "balance_cents", default: 0, null: false
|
||||||
t.string "nickname"
|
t.string "nickname"
|
||||||
|
t.boolean "admin"
|
||||||
|
t.boolean "koelkast", default: false
|
||||||
|
t.integer "dagschotel_id"
|
||||||
|
t.integer "orders_count", default: 0
|
||||||
|
t.string "avatar_file_name"
|
||||||
|
t.string "avatar_content_type"
|
||||||
|
t.integer "avatar_file_size"
|
||||||
|
t.datetime "avatar_updated_at"
|
||||||
t.datetime "created_at"
|
t.datetime "created_at"
|
||||||
t.datetime "updated_at"
|
t.datetime "updated_at"
|
||||||
t.string "encrypted_password", default: "", null: false
|
t.string "encrypted_password", default: "", null: false
|
||||||
|
@ -56,16 +64,11 @@ ActiveRecord::Schema.define(version: 20150209113630) do
|
||||||
t.datetime "last_sign_in_at"
|
t.datetime "last_sign_in_at"
|
||||||
t.string "current_sign_in_ip"
|
t.string "current_sign_in_ip"
|
||||||
t.string "last_sign_in_ip"
|
t.string "last_sign_in_ip"
|
||||||
t.boolean "admin"
|
|
||||||
t.integer "dagschotel_id"
|
|
||||||
t.string "avatar_file_name"
|
|
||||||
t.string "avatar_content_type"
|
|
||||||
t.integer "avatar_file_size"
|
|
||||||
t.datetime "avatar_updated_at"
|
|
||||||
t.integer "orders_count", default: 0
|
|
||||||
t.boolean "koelkast", default: false
|
|
||||||
end
|
end
|
||||||
|
|
||||||
|
add_index "users", ["koelkast"], name: "index_users_on_koelkast"
|
||||||
|
add_index "users", ["orders_count"], name: "index_users_on_orders_count"
|
||||||
|
|
||||||
create_table "versions", force: true do |t|
|
create_table "versions", force: true do |t|
|
||||||
t.string "item_type", null: false
|
t.string "item_type", null: false
|
||||||
t.integer "item_id", null: false
|
t.integer "item_id", null: false
|
||||||
|
|
12
test/fixtures/products.yml
vendored
12
test/fixtures/products.yml
vendored
|
@ -3,16 +3,16 @@
|
||||||
# Table name: products
|
# Table name: products
|
||||||
#
|
#
|
||||||
# id :integer not null, primary key
|
# id :integer not null, primary key
|
||||||
# name :string(255)
|
# name :string(255) not null
|
||||||
# price_cents :integer
|
# price_cents :integer default(0), not null
|
||||||
# created_at :datetime
|
# category :integer default(0)
|
||||||
# updated_at :datetime
|
# stock :integer default(0), not null
|
||||||
# avatar_file_name :string(255)
|
# avatar_file_name :string(255)
|
||||||
# avatar_content_type :string(255)
|
# avatar_content_type :string(255)
|
||||||
# avatar_file_size :integer
|
# avatar_file_size :integer
|
||||||
# avatar_updated_at :datetime
|
# avatar_updated_at :datetime
|
||||||
# category :integer default(0)
|
# created_at :datetime
|
||||||
# stock :integer default(0)
|
# updated_at :datetime
|
||||||
#
|
#
|
||||||
|
|
||||||
# Read about fixtures at http://api.rubyonrails.org/classes/ActiveRecord/FixtureSet.html
|
# Read about fixtures at http://api.rubyonrails.org/classes/ActiveRecord/FixtureSet.html
|
||||||
|
|
18
test/fixtures/users.yml
vendored
18
test/fixtures/users.yml
vendored
|
@ -5,8 +5,16 @@
|
||||||
# id :integer not null, primary key
|
# id :integer not null, primary key
|
||||||
# name :string(255)
|
# name :string(255)
|
||||||
# last_name :string(255)
|
# last_name :string(255)
|
||||||
# balance :integer default(0)
|
# balance_cents :integer default(0), not null
|
||||||
# nickname :string(255)
|
# nickname :string(255)
|
||||||
|
# admin :boolean
|
||||||
|
# koelkast :boolean default(FALSE)
|
||||||
|
# dagschotel_id :integer
|
||||||
|
# orders_count :integer default(0)
|
||||||
|
# avatar_file_name :string(255)
|
||||||
|
# avatar_content_type :string(255)
|
||||||
|
# avatar_file_size :integer
|
||||||
|
# avatar_updated_at :datetime
|
||||||
# created_at :datetime
|
# created_at :datetime
|
||||||
# updated_at :datetime
|
# updated_at :datetime
|
||||||
# encrypted_password :string(255) default(""), not null
|
# encrypted_password :string(255) default(""), not null
|
||||||
|
@ -16,14 +24,6 @@
|
||||||
# last_sign_in_at :datetime
|
# last_sign_in_at :datetime
|
||||||
# current_sign_in_ip :string(255)
|
# current_sign_in_ip :string(255)
|
||||||
# last_sign_in_ip :string(255)
|
# last_sign_in_ip :string(255)
|
||||||
# admin :boolean
|
|
||||||
# dagschotel_id :integer
|
|
||||||
# avatar_file_name :string(255)
|
|
||||||
# avatar_content_type :string(255)
|
|
||||||
# avatar_file_size :integer
|
|
||||||
# avatar_updated_at :datetime
|
|
||||||
# orders_count :integer default(0)
|
|
||||||
# koelkast :boolean default(FALSE)
|
|
||||||
#
|
#
|
||||||
|
|
||||||
# Read about fixtures at http://api.rubyonrails.org/classes/ActiveRecord/FixtureSet.html
|
# Read about fixtures at http://api.rubyonrails.org/classes/ActiveRecord/FixtureSet.html
|
||||||
|
|
|
@ -3,16 +3,16 @@
|
||||||
# Table name: products
|
# Table name: products
|
||||||
#
|
#
|
||||||
# id :integer not null, primary key
|
# id :integer not null, primary key
|
||||||
# name :string(255)
|
# name :string(255) not null
|
||||||
# price_cents :integer
|
# price_cents :integer default(0), not null
|
||||||
# created_at :datetime
|
# category :integer default(0)
|
||||||
# updated_at :datetime
|
# stock :integer default(0), not null
|
||||||
# avatar_file_name :string(255)
|
# avatar_file_name :string(255)
|
||||||
# avatar_content_type :string(255)
|
# avatar_content_type :string(255)
|
||||||
# avatar_file_size :integer
|
# avatar_file_size :integer
|
||||||
# avatar_updated_at :datetime
|
# avatar_updated_at :datetime
|
||||||
# category :integer default(0)
|
# created_at :datetime
|
||||||
# stock :integer default(0)
|
# updated_at :datetime
|
||||||
#
|
#
|
||||||
|
|
||||||
require 'test_helper'
|
require 'test_helper'
|
||||||
|
|
|
@ -5,8 +5,16 @@
|
||||||
# id :integer not null, primary key
|
# id :integer not null, primary key
|
||||||
# name :string(255)
|
# name :string(255)
|
||||||
# last_name :string(255)
|
# last_name :string(255)
|
||||||
# balance :integer default(0)
|
# balance_cents :integer default(0), not null
|
||||||
# nickname :string(255)
|
# nickname :string(255)
|
||||||
|
# admin :boolean
|
||||||
|
# koelkast :boolean default(FALSE)
|
||||||
|
# dagschotel_id :integer
|
||||||
|
# orders_count :integer default(0)
|
||||||
|
# avatar_file_name :string(255)
|
||||||
|
# avatar_content_type :string(255)
|
||||||
|
# avatar_file_size :integer
|
||||||
|
# avatar_updated_at :datetime
|
||||||
# created_at :datetime
|
# created_at :datetime
|
||||||
# updated_at :datetime
|
# updated_at :datetime
|
||||||
# encrypted_password :string(255) default(""), not null
|
# encrypted_password :string(255) default(""), not null
|
||||||
|
@ -16,14 +24,6 @@
|
||||||
# last_sign_in_at :datetime
|
# last_sign_in_at :datetime
|
||||||
# current_sign_in_ip :string(255)
|
# current_sign_in_ip :string(255)
|
||||||
# last_sign_in_ip :string(255)
|
# last_sign_in_ip :string(255)
|
||||||
# admin :boolean
|
|
||||||
# dagschotel_id :integer
|
|
||||||
# avatar_file_name :string(255)
|
|
||||||
# avatar_content_type :string(255)
|
|
||||||
# avatar_file_size :integer
|
|
||||||
# avatar_updated_at :datetime
|
|
||||||
# orders_count :integer default(0)
|
|
||||||
# koelkast :boolean default(FALSE)
|
|
||||||
#
|
#
|
||||||
|
|
||||||
require 'test_helper'
|
require 'test_helper'
|
||||||
|
|
Loading…
Reference in a new issue