2010-12-30 3 views
2

모델의 자기를 참조해야합니다 : has_many 선언."self"를 연관 선언에 사용하십시오 (: has_many, : has hasone)

나는 Foo라고 부르는 클래스가 있습니다. 푸 : has_many 모음. Foo에는 : has_many 관계에있는 Bars의 순서를 결정하는 randomize라는 부울 속성이 있습니다. randomize가 true이면 DB에 따라 "RAND()"또는 "RANDOM()"으로 정렬됩니다. 그렇지 않은 경우 ID로 정렬됩니다. 열정적 인로드를 사용하기 때문에 협회에서이 선언을해야합니다. 나는 내가 원하는 것을 반환하는 Foo에서 메서드를 정의 할 수 있다는 것을 잘 알고 있지만, 한 번에 모든 것을로드해야합니다. 그렇지 않으면 400-500 개의 쿼리가 개별적으로 실행됩니다. = 나쁜 것입니다.

class CreateFoo < ActiveRecord::Migration 
    def self.up 
    create_table :foos do |t| 
     t.string :name 
     t.boolean :randomize, :default => false 
    end 
    end 
end 

 

class CreateBar < ActiveRecord::Migration 
    def self.up 
    create_table :bars do |t| 
     t.string :name 
     t.references :foo 
    end 
    end 
end 

 

class Bar < ActiveRecord::Base 
    belongs_to :foo 
end 

 

class Foo < ActiveRecord::Base 
    # this is the line that doesn't work 
    has_many :bars, :order => self.randomize ? 'RAND()' : 'id' 
end 

어떻게 자체의 속성에 액세스 할 lh has_many 선언에?

상황이 나는했으나 실패했습니다

우는 람다 함수

  • 을 어떻게이게 가능 만드는 올바른 문자열
  • 을 반환 푸하는 방법을 만들어? has_many Foo 타입이 아닌 :

    undefined method `randomize' for #<Class:0x1076fbf78> 
    

    내가 얻을 오류 중 하나입니다

    문제에서 "자기"는 것 같다. Foo 객체가 아닌 일반 클래스라는 것에 주목하자. 왜 그런가?

  • 답변

    2

    Ryan Bates는 Railscast에서 비슷한 주제 인 here을 만났습니다. 메서드를 사용하여 ...

    -1

    기본 범위를 사용하는 대신에 has_many 선언

    class Bar < ActiveRecord::Base 
        default_scope lambda { order(self.randomize ? 'RAND()' : 'id') } 
    

    하지만 직접 귀하의 질문에 대답하기 위해, 당신의 has_many 선언 자체가 푸 클래스가 아닌 푸의 인스턴스를 참조로 봅니다.

    +0

    범위를 정의해야합니다. # sethvargo

    +0

    에 대해 'includes_values'메소드가 포함되어 있으므로 Foo 클래스가 아닌 Foo 클래스의 인스턴스를 얻으려면 어떻게해야합니까? – sethvargo

    +0

    세션에 클래스 정의를 사용할 수없는 객체가 포함되어 있습니다. 세션에 보관 된 모든 개체의 클래스가 필요합니다. (원래 예외 : # [NoMethodError]에 대해 정의되지 않은 메소드'includes_values ​​') – sethvargo

    0

    자체는 클래스입니다.

    당신이 필요로하는 것을하기 위해 당신은 람다를 통과하려고 할 수 있습니다.

    class Foo < AR::Base 
        has_many :bars, :order => lambda { self.randomize? ? 'RAND()' : 'id' } 
    end 
    

    테스트하지는 않았지만 제대로 작동합니다.

    +0

    아니요. Proc가 주문하려고하기 때문에 작동하지 않습니다. "no columns <#Proc:..> in foos"와 같은 오류가 발생합니다. – sethvargo