2014-09-18 3 views
1

레일스에서 ​​e- 러닝을 개발 중이며 e- 러닝의 다양한 섹션을 통해 사용자의 진행 상황을 추적하기 위해 데이터베이스에 배열 세트를 저장하려고합니다. .레일에서 배열 저장 및 검색

나는이 질문에 대답 건너했습니다
Storing arrays in database : JSON vs. serialized array
...이 유용 할 수 있습니다처럼 들리 겠지만 나는 내가 개발하고 있어요 레일 프로젝트에 통합하는 방법을 알아낼 수 없습니다.

나는 레일스 멍청한 녀석이라는 것을 감안할 때, 누군가가 나에게 어떻게 설명 할 수 있었는지, 보통 영어로 (또는 대안으로 일반 코드로) 어떻게 표현할 수 있겠는가?
a) 데이터베이스에 ' false '사용자가 처음 가입 할 때 부울입니다.
b) 전자 학습을 통해 다양한 페이지에서 Array를 검색하고 업데이트합니다.

나는 내가 시도한 것을 설명 하겠지만, 어둠 속에서는 찌르는듯한 찌르다가 어디서부터 시작해야할지 몰라. Comment 클래스는 controllers 폴더에 저장해야합니까? 또는 내 예제에서 실제로 User 클래스입니까? (비슷하게 ActiveRecord를 확장합니다)?

다시 한번 말하지만 (코드가 어디에 속하는 지 이상적으로 설명하는) 도움이 되서 감사합니다. ,
내가 (예상) 이메일, 사용자 이름 등 여러 분야를 가지고 데이터베이스에서 사용자 테이블이 있습니다

UPDATE는

좀 더 구체적으로 물어 봤는데, 그래서 나는 시도 할 것이다 나는 사용자 테이블에 5 개의 필드를 추가하고 각각 5 개의 섹션을 통해 사용자의 진행 상황을 추적하는 Array를 저장하고 싶습니다. 나는 사용자가 컨텐트를 열면 Array가 업데이트되고 해당 인덱스가 'true'로 업데이트되어 섹션의 일부가 완료되었음을 알립니다. 나는 희망이 도움이

...

사용자가 첫 번째 징후가 나는 배열이 '거짓'부울의 순서로 설정해야 할

RE-UPDATE. 어떤 파일에서 배열을 설정할 수 있습니까? 그것은 사용자로 이루어 졌습니까? 나는 이것을 시도하고 있지만, 값이 설정되고 있다고는 생각하지 않습니다. 오류가 발생하지는 않습니다.

class User < ActiveRecord::Base 
    # Include default devise modules. Others available are: 
    # :confirmable, :lockable, :timeoutable and :omniauthable 
    serialize :leadership_styles_progress 
    serialize :skills_progress 
    serialize :safeguarding_progress 
    serialize :tools_progress 

    before_create :set_progress_vars 

    devise :database_authenticatable, :registerable, 
     :recoverable, :rememberable, :trackable, :validatable 
    validates :age, presence: { :message => ": Please choose your age" } 
    validates :section, presence: { :message => ": Please choose the section you belong to"} 
    has_many :posts 

    private 

    def set_progress_vars 
    self.leadership_styles_progress = [false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false] 
    self.skills_progress = [false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false] 
    self.safeguarding_progress = [false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false] 
    self.tools_progress = [false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false] 
    end 

end 

나는 '레이크 루트'를 통해 어디에 어떤 경로가 매핑되는지 확인했습니다. users/sign_up은 devise/registrations/new에 매핑됩니다. 아래에 제안 된 serialize 코드는 거기에 있습니까?

+0

조금 더 명확하게 설명해 주실 수 있습니까? 사용자는 많은 페이지가있는 코스를 가지고 있으며 방문한 페이지를 저장하고 싶습니까? 이상적으로는 관련 테이블 만있는 간단한 db 구조의 일부 형태가 유용 할 것입니다 –

+0

이 배열을 쿼리해야합니까? 그렇다면'serialize'가 적이며리스트를 위해 별도의 컬럼이나 별도의 테이블을 사용하는 것이 더 낫습니다. –

+0

사용자가 로그인 할 때 (UP 기호와 반대) Array를 deserialize하고 로컬 변수에로드해야합니다 (가정). 새로운 콘텐츠를 볼 때 데이터베이스에서 Array를 업데이트하려고합니다. 그걸 '직렬화'할 수 있습니까? – moosefetcher

답변

0

당신은 코멘트와 사용자 클래스가 ActiveRecord를 확장한다고 언급했습니다. 이들은 모델이며 app/models 폴더에 있습니다.

데이터베이스에 배열을 저장하면 연결된 대답에 설명 된 것처럼 매우 간단합니다. 이를 프로젝트에 통합하기 위해서해야 할 일은 배열을 저장할 속성을 선언하는 것뿐입니다. 저장하거나 업데이트 할 때 자동으로 직렬화되고 다시 읽으려고 할 때 deserialize됩니다.

이미 코드를 게시해야합니다.직렬화하려는 속성이 Comment 모델에 있다고 가정하고 choices (물론 아무것도 될 수 있음)이라고 가정합니다. 문자열 필드가 아닙니다. 배열이 더 커지면 문자열 필드가 너무 짧을 수 있습니다. 직렬화시 255 자 이상) :

# app/models/comment.rb 
class Comment < ActiveRecord::Base 
    serialize :choices 
end 

그게 다야! 이제 당신은 당신이 저장할 때 자동으로 YAML로 연재됩니다 @comment.choices = [false, false] 그 속성에 값을 할당 한 후이 직렬화됩니다 이제까지 당신이 그것을 읽을 때 때

class CommentController < ApplicationController 
    def create 
    @comment = Comment.new choices: [false, false, true, 'stuff', 'whatever'] 
    end 

    def show 
    @comment = Comment.find params[:id] 
    @comment.choices # returns [false, false, true, 'stuff', 'whatever'] 
    end 
end 

는 "후드"에 무슨 일이 일어나고 있는지 설명하기 choices 필드에 지정된 배열 값으로 레코드를 저장할 때 ActiveRecord는 사용자가 Comment 클래스에 serialize :choices을 선언 한 이후에 serialize하려는 것을 알고 있습니다. 그것은 그 배열 값을 가지고 다음과 같이 직렬화 것이다

YAML.dump(choices) 

이 문자열로 배열 변환 것이다

어레이의 YAML 표현 (직렬화)이다
"---\n- false\n- false\n- true\n- stuff\n- whatever\n" 

. (당신이 comment.choices를 호출 할 때) 그것을 다시 읽으려면 액티브는 직렬화 된 문자열을 가지고 직렬화됩니다 : 다음 루비 배열로 다시 YAML 문자열을 변환합니다

YAML.load(choices) 

.

은 요약하면 :

  • 이 모델에 텍스트 필드를 예를 들어 추가 마이그레이션을 생성 할 때 choices:text.
  • 귀하의 모델에 serialize :choices을 선언하십시오.
  • 정상적으로 사용하십시오.

희망이 있습니다.

+0

그래서 사용자 테이블과 사용자 모델이 있다면 사용자 모델에 'serialize : choices'가 있어야합니까? 나는 그 대답을 고맙게 생각하지만, 나는 여전히 코드를 어디에 넣어야할지 모른다. 사용자에 대한 참조가없는 경우 배열을 올바른 사용자 (current_user)에 저장하려면 어떻게합니까? – moosefetcher

+0

나는 또한 아직도 그 이유를 따르지 않는다 : 선택은 상징으로 정의되었지만 그 다음 방법으로 언급된다. 또한 그것은 왜 콜론 (colon)에 의해 처음에 선행되고 그 다음에 이어지는가? Ruby의 단점 중 하나입니까? 죄송합니다. 나는 아마 조금 좌절하고있다. – moosefetcher

+0

나는 그들이 당신에게 달려 있기 때문에 당신의 질문 중 일부는 정말로 대답 할 수 없습니다. 사용자 모델에서'선택 '? 모르겠다. 스키마를 어떻게 정의 했는가? 데이터를 어디에 저장 하시겠습니까? 그것은 당신에게 달려 있습니다. 예를 들어,'choices'라는 User 테이블에 필드를 추가했다면, User 모델에서'serialize : choices'를 사용하여 해당 필드를 직렬화하고자한다고 선언합니다.필드 이름이기 때문에 필드를 참조하지만 User 테이블의 필드이기 때문에 User 모델의 속성이기도합니다 (사용자 테이블의 필드이기 때문에) – DiegoSalazar