2014-07-01 4 views
1

견적, 저자 : 열이있는 데이터베이스 견적을 유지하는 모델 견적이 있습니다. 내 문제는 내 컨트롤러에서 맞춤 디스플레이를 만드는 중입니다.메소드 작성 모델

나는 다음과 같은 방법을 만들었고 많은 변화를 시도했다. 나는 다양한 인용문에 할당 된 모든 저자의 목록을 얻으려고합니다.

class Quote < ActiveRecord::Base 
    has_paper_trail 
    acts_as_taggable 

    belongs_to :source 

    scope :with_source_id, lambda { |id| where("source_id = ?", "#{id}") } 

    def quote_authors 
    authors = [] 
    Quote.all.each do |quote| 
     authors << quote.author 
    end 
    authors.uniq! 
    end 

end 

필자는 다양한 버전의 자체 테스트를 시도했지만 필자는 그것을 파악하지 못했습니다. 나는이 너무

def quote_authors(quote_list) 
    authors = [] 
    quote_list.each do |quote| 
    authors << quote.author 
    end 
    authors.uniq! 
end 
+1

견적 모델은 belongs_to이 있습니까 : 작가 협회를? – infused

+1

현재 사용중인 방법에 어떤 문제가 있습니까? 작동하지 않습니까? 아니면 뭔가 깨끗한 것을 찾고 계십니까? –

답변

1

방법

난 당신이 class methods vs instance methods로보고 혜택을 얻을 것입니다 생각 - 나는 당신이 예를 방법으로 quote_authors를 호출하고있다 볼 수있는 주요 문제 중 하나가되는, 정의의 올바른 있지만, 응용 프로그램이 예를 메소드를 호출하는 경우 당신이 가지고있는 문제가

에서 옳지 않다 - 그것은 개체의 인스턴스에 있어야한다 :

@user = User.find params[:id] #-> creates instance of object 
@user.instance_method #-> calls instance method with data of object 

인스턴스 메서드를 사용하는 경우에는 실제로 개체의 인스턴스화 된 데이터를 조작해야합니다.현재, 당신은 이것을하지 않고 있습니다. bratsche으로

지적했다

- 시스템 - 당신은 당신의 quotes에 대한 저자 이름을로드하려는 경우

#app/models/quote.rb 
Class Quote < ActiveRecord::Base 
    def self.quote_authors 
     Quote.all.each do |quote| 
      #... 
     end 
    end 
end 

: 당신이 클래스 방법을 사용할 필요가 제안하는 레일 내부에 ActiveRecord associations 시스템을 사용하는 것이 훨씬 더 적합 할 것입니다 :

#app/models/quote.rb 
Class Quote < ActiveRecord::Base 
    belongs_to :author 
    delegate :name, to: :author, prefix: true 
end 

#app/models/author.rb 
Class Author < ActiveRecord::Base 
    has_many :quotes 
end 

이 설정은 호출 할 수 있습니다 :

@quote = Quote.find params[:id] 
@quote.author_name 
1

그것은 author 당신의 Quote 모델에 불과 문자열 열 당신의 열 같은 소리 시도? 그렇다면 조금 변화하는 것이 좋습니다.

rails g model author name:string 
rails g model quote text:string author:references 

app/models/quote.rb :

class Quote < ActiveRecord::Base 
    belongs_to :author 
end 

그리고 app/models/author.rb :

class Author < ActiveRecord::Base 
    has_many :quotes 
    validates_uniqueness_of :name 
end 

이제 당신이있어 두 모델

는 두 가지 모델을 만듭니다. 의이 새로운 견적을 만드는 가정 해 봅시다, 당신은 저자의 텍스트와 이름이 :

quote_text = 'Rails is okayish' 
author_name = 'bratsche' 

author = Author.find_or_create_by_name(author_name) 
author.quotes.create(text: quote_text) 

그리고 당신의 원래의 질문에 도착, 당신은 어떻게 고유 한 사용자의 목록을 얻을 수 있습니까를?

Author.all 

당신은 (대부분)이 고유 될 것이라고 보장하고, 당신은 이름으로 새로운 목록을 구축 한 다음에 #uniq!를 호출하는 모든 따옴표의 목록을 통해 반복에 의존 할 필요가 없습니다 . 이렇게하면 데이터베이스에서 완전히 수행 할 수 있습니다.