2015-02-04 4 views
0

가상웨어 하우스를 구축하려고합니다. 데이터베이스의 열 중 하나에 고정 값이 있어야하는웨어 하우스 내의 위치 목록이 포함됩니다. 창고는 통로 DA에서 조지아로 분할되며 각 통로는 011에서 603으로 분할됩니다. 모든 통로를 가로 지르는 가로 통로가 있으며 특정 위치를 제거합니다 (실제로는 실제 기존 창고에서 오는 것입니다). 다른 열은 제품 이름, 제품 무게 및 수량입니다. 내 마이그레이션 코드는 다음과 같습니다열 중 하나에서 고정 값을 미리 정의하는 방법

def change 
create_table :locations do |t| 
    t.string :location # this column is supposed to have fixed values 
    t.string :product # name of a product like CocaCola Zero 8x2L 
    t.decimal :product_weight 
    t.integer :quantity 

    t.timestamps 
end 

을 별도의 문서에서 나는 클래스라는 위치를 만들어 내가 방법 데프 위치 목록 생성이 클래스 내에서 numbers_letters 불렀다 :

def numbers_letters 
    @digit = 3 
    aisle_number = 0 
    odd_list = [] 
    even_list = [] 
    for @letter in "DA".."GA" 
    aisle_number = aisle_number + 1 
    @letter.next! 
    while @digit < 604 
     @digit += 8 
     if aisle_number.odd? 
     odd_list << @digit 
     else 
     even_list << @digit 
     end 
     @digit += 2 
     if aisle_number.odd? 
     odd_list << @digit 
     else 
     even_list << @digit 
     end 
    end 
    @digit = 3 
    odd_list.each do |odd| 
     if odd > 350 && odd < 604 
     od = format('%003d', odd) 
     $list_of_locations << @letter + od 
     elsif odd < 322 && odd > 3 
     od = format('%003d', odd) 
     $list_of_locations << @letter + od 
     end 
    end 
    even_list.each do |even| 
     if even > 300 and even < 604 
     ev = format('%003d', even) 
     $list_of_locations << @letter + ev 
     elsif even > 3 and even < 262 
     ev = format('%003d', even) 
     $list_of_locations << @letter + ev 
     end 
    end 
    odd_list = [] 
    even_list = [] 
    end 
end 

내 목표를 사용자가 사용 가능한 목록에서 위치를 선택하고 제품의 케이스의 무게와 양을이 위치로 설정할 수있는 페이지를 만드는 것입니다. 나중에 배포 작업을 프로그램하고 싶지만 지금은이 문제를 해결해 보겠습니다. 나는 당신의 요구 사항을 이해하지만 마이그레이션 파일에 다음을 설정하지

답변

0

:

list_of_locations = numbers_letters

데이터베이스에 추가하기 "디폴트 값"을 찾는 것이 아니라 오히려 뷰 형식에서 그 값에 대한 가능성 목록을 표시하는 방법으로 보입니다.

# app/models/location.rb 
class Location < ActiveRecord::Base 

    def numbers_letters 
    # EdwardM code here 
    end 
end 

# app/controllers/locations_controller.rb 
class LocationsController < ApplicationController 

    def new 
    @location = Location.new 
    end 

    def create 
    @location = Location.new params[:location] 
    @location.save 
    respond_with @location 
    end 
end 

# app/views/locations/new.html.erb 
<%= form_for @location do |f| %> 
    First name: <%= f.text_field :product %><br /> 
    Last name : <%= f.text_field :quantity %><br /> 
    location : <%= f.select(:location, @location.numbers_letters) %> 

    <%= f.submit %> 
<% end %> 

```

이 당신이 찾고 있던 무엇인가?당신이 설정 될 것입니다 때문에

def change 
    create_table :locations do |t| 
    t.string :aisle # CG 
    t.string :location # number 
    t.string :product # name of a product like CocaCola Zero 8x2L 
    t.decimal :product_weight 
    t.integer :quantity 
    t.timestamps 
end 

:

그래서주의 경우 어쩌면 당신이 고려해야 할 2 개 위치가 아닌 가능한 모든 문자 - 숫자의 조합

무엇인가 등을 에너지 잠재 목록을 생성하는 것입니다

location = Location.new(aisle: 'CG', location '123') 
location.save 

참고 :

,은 데모, 당신은 아마

class Location < ActiveRecord::Base 
    def self.available_aisiles 
    "DA".."GA" 
    end 

    def self.available_locations 
    '011'..'603' 
    end 
end 

# and then call 

Location.available_locations 
Location.available_aisiles 
0

t.string 위치, 기본 : "당신의 가치"

나는 당신의 요구 사항을 이해 잘못 생각하는 경우 나 수정 .

+0

난 그냥 내 질문에 업데이트 한 같은 클래스 메소드를 사용하는 것이 좋습니다 것입니다. 보세요, 당신은 지금 이해할 수 있습니다. 기본적으로 원하는 위치는 DA011, DA012 .... DB011, DB12 ....... GA603입니다. 600 개가 넘는 위치가 있지만 답변에서 다음과 같이 할 수 있습니다. t.string : location, default : $ list_of_locations .. 맞습니까? –

1

코드를 먼저 리펙토링합니다. 이 라인을 따라 뭔가 :

입니다
def numbers_letters 
    list_of_locations = [] 
    aisle_number = 0 
    odd_list = [] 
    even_list = [] 

    ('DB'..'GB').each do |letter| 
    aisle_number += 1 

    rng = (11..604) 
    rng.step(8).each do |digit| 
     if aisle_number.odd? 
     odd_list << digit << digit + 2 
     else 
     even_list << digit << digit + 2 
     end 
    end 

    odd_list.each do |odd| 
     list_of_locations << letter + format('%003d', odd) if odd > 350 || odd < 322 
    end 
    even_list.each do |even| 
     list_of_locations << letter + format('%003d', even) if even > 300 || even < 262 
    end 
    end 

    list_of_locations 
end 

, 대신에의 each을 사용하고 rangestep 활용합니다. 또한 여기서는 글로벌 변수 또는 인스턴스 변수를 사용하지 않아야합니다. 로컬 변수 만 사용할 수 있기 때문입니다. 그냥 일반 지역 변수는 괜찮습니다. 대신 글로벌 VAR을 수정하는 위치의 목록을 반환하도록 그래서 코드가 조금 변경되었습니다, 다음과 같이 당신은 그것을 사용 :

class AddPredefinedLocations < ActiveRecord::Migration 
    # assumes class PredefinedLocation < ActiveRecord::Base in app/models 
    def up 
    create_table :predefined_locations do 
     t.string :location 
    end 

    numbers_letters.each do |loc| 
     PredefinedLocation.create location: loc 
    end 
    end 

    def down 
    drop_table :predefined_locations 
    end 
end 
+0

좋은 하나! 나는 그 코드가 얼마나 간단한 지 결코 생각하지 않을 것이다. 내 코드는 너무 복잡하지만 불필요하게 복잡합니다. 나는 [범위]와 [단계]를 기억할 것이다. 그러나 아직 마이 그 레이션에서 내 [: 위치]에 list_of_locations를 도입하는 방법을 알지 못합니다. 또는 t.string : location, default : list_of_locations 만 입력하면 간단합니다. 그런 다음 위치 목록을 생성하는 코드를 입력 할 위치는 어디입니까? –

관련 문제