2017-09-03 3 views
0

내 맞춤 Ruby 스크립트에서 활성 레코드 5를 사용 중입니다.Model - Active Record 5/Rails에서 변경된 데이터 얻기

(제어기/레이크 태스크)

books.each do |book| 
    b_id = book[“b_id”] 
    bk = Books.where(book_id: b_id).first 
    bk = Books.new(book_id: b_id) unless bk 
    bk.update_book_info(book) 
    if bk.changed? 
    # ...send book title to Api... 
    bk.save! 
    end 
end 

(모델)

class Book < ActiveRecord::Base 
    before_save :get_title 
    def update_book_info(book) 
    @book = book 
    end 

    private 
    def get_title 
    # do ..something 
    self.title = @book[’title’] 
    end 

end 

books 배열이다.

[...send book title to Api...] 부분에 유의하십시오. 내가 API에 보낼 수 있도록 책 제목을 알아야합니다. 나는 bk.title을 시도했지만 null을 반환합니다!

도서 제목을 얻으려면 어떻게해야합니까?

또한 컨트롤러에서 모델로 더 많은 코드를 옮길 수 있습니까? 이 nil을 반환하는 경우

도움말 :

+0

'books' 변수에 대한 자세한 정보를 제공 할 수 있습니까? '해쉬 '의'Array'입니까? 아니면 이미 모델 인스턴스입니까? 해결책은 그것에 달려 있습니다. –

+0

혼란에 드려 죄송합니다. 책은 배열입니다. – learner2017

+0

"Books"의 "s"가 유형이고 실제로는 book_id라는 열이 있다고 가정합니다. –

답변

0

는 ... 그럼 비어 있습니다. 레일 콘솔에서 개체를 확인하십시오. 터미널에서 은 실행

rails c 

다음 :

Book.first # see the whole object 
Book.first.title # see its title 
Book.all.pluck(:title) # see all the titles in the database 
당신은하지 저장 될 제목을 원인이 뭔가 잘못이없는 경우 당신은 당신의 책을 저장 위치를 ​​확인 할 수 있습니다

.

사이드 노트 : 코드에서 불필요한 검색어를 수행 중입니다. each 루프에서 이미 데이터베이스에있는 개체를 쿼리하고 있습니다. 이 줄 :

bk = Books.where(book_id: b_id).first # useless query 

당신이 id 추출 된 동일한 book 개체를 반환하는 것입니다. 또한 id가있는 객체를 찾을 때 where을 사용할 필요가 없습니다. id가 고유하기 때문에 하나의 객체 만 반환 할 수 있습니다. #find 또는 #find_by을 사용하십시오. 이 같은 #assign_attributes(new_attributes)을 사용할 수 #update_book_info

+0

제목이 0이 아닙니다! – learner2017

0

대신하는 방법을 만듭니다

bk.assign_attributes(book)

그것은 당신의 모델이 먼지되고 #changed? 방법은 작동을 보장합니다. 또한 bk#title#save 전에로드되며, 원하는 것으로 보입니다.

그런 다음 before_save#get_title도 삭제할 수 있습니다.

관련 문제