복붙노트

[RUBY-ON-RAILS] has_many 레일 : 찾기를 통해 모델을 가입에 추가 속성에 의해

RUBY-ON-RAILS

has_many 레일 : 찾기를 통해 모델을 가입에 추가 속성에 의해

두 루비와 레일스에 새로운하지만 난 (분명히 하하, 아무 의미없는) 지금 교육 책입니다.

나는 두 가지 모델이있어, 이벤트 및 사용자는 테이블 EventUser을 통해 합류

class User < ActiveRecord::Base
  has_many :event_users
  has_many :events, :through => :event_users
end

class EventUser < ActiveRecord::Base
  belongs_to :event
  belongs_to :user

  #For clarity's sake, EventUser also has a boolean column "active", among others
end

class Event < ActiveRecord::Base
  has_many :event_users
  has_many :users, :through => :event_users
end

이 프로젝트는 내가 사람들이 가입하고 해당 이벤트에 대한 자신의 이름을 긁적를 추적해야하는 일정입니다. 나는 많은에 많은 좋은 방법입니다 파악,하지만 난 이런 일을 수행 할 수 없습니다

u = User.find :first
active_events = u.events.find_by_active(true)

이벤트가 실제로 추가 데이터가없는 때문에, EventUser 모델은 않습니다. 그리고 내가 할 수있는 동안 :

u = User.find :first
active_events = []
u.event_users.find_by_active(true).do |eu|
  active_events << eu.event
end

이것은 "레일 방식"에 반하는 것 같다. 누군가가 가르치 려 수 시간이 오래 오늘 밤 (오늘 아침) 나를 귀찮게하고있다?

해결법

  1. ==============================

    1.어떻게 사용자 모델로이 같은 추가에 대한?

    어떻게 사용자 모델로이 같은 추가에 대한?

    has_many  :active_events, :through => :event_users, 
              :class_name => "Event", 
              :source => :event, 
              :conditions => ['event_users.active = ?',true]
    

    그냥 호출하여 사용자에 대한 활성 이벤트를 얻을 수 있어야 그 후 :

    User.first.active_events
    
  2. ==============================

    2.밀란 Novota 좋은 솔루션을 제공 -하지만 : 조건은 사용되지 않습니다과 : 조건 => [사실 'event_users.active =?'] 단지 매우 어쨌든 레일 보이지 않는다 비트. 나는 이런 식으로 뭔가를 선호합니다 :

    밀란 Novota 좋은 솔루션을 제공 -하지만 : 조건은 사용되지 않습니다과 : 조건 => [사실 'event_users.active =?'] 단지 매우 어쨌든 레일 보이지 않는다 비트. 나는 이런 식으로 뭔가를 선호합니다 :

    has_many :event_users
    has_many :active_event_users, -> { where active: true }, class_name: 'EventUser'
    has_many :active_events, :through => :active_event_users, class_name: 'Event', :source => :event
    

    당신은 여전히 ​​호출하여 사용자에 대한 활성 이벤트를 얻을 수 있어야 그 후 :

    User.first.active_events
    
  3. ==============================

    3.당신의 u.events 명시 적으로 user_events 테이블을 호출되지 않은 경우에도, 그 테이블은 여전히 ​​암시 때문에 필요한 조인의 SQL에 포함되어 있습니다. 그래서, 당신은 여전히 ​​찾기 조건에 해당 테이블을 사용할 수 있습니다 :

    당신의 u.events 명시 적으로 user_events 테이블을 호출되지 않은 경우에도, 그 테이블은 여전히 ​​암시 때문에 필요한 조인의 SQL에 포함되어 있습니다. 그래서, 당신은 여전히 ​​찾기 조건에 해당 테이블을 사용할 수 있습니다 :

    u.events.find(:all, :conditions => ["user_events.active = ?", true])
    

    당신이 있는지 확인 후 많은이 조회를 수행 할 계획이라면 물론, 밀란 Novota에서 알 수 있듯이 그것을 별도의 연결을 제공하지만, 당신이 그런 식으로 할에 대한 요구 사항은 없습니다

  4. ==============================

    4.음, 더 많은 책임이 실제로 필요한 것보다 사용자 모델에 넣어되고 있으며, 그렇게 할 좋은 이유가 없다.

    음, 더 많은 책임이 실제로 필요한 것보다 사용자 모델에 넣어되고 있으며, 그렇게 할 좋은 이유가 없다.

    실제로처럼 어디에 속해 있기 때문에 우리가 먼저 EventUser 모델의 범위를 정의 할 수 있습니다 :

    class EventUser < ActiveRecord::Base
      belongs_to :event
      belongs_to :user
    
      scope :active,   -> { where(active: true)  }
      scope :inactive, -> { where(active: false) } 
    end
    

    우리는 사용자 모델의 관계를 정의 할 수 있도록 다음과 같이 활성 이벤트뿐만 아니라 비활성 이벤트 : 이제, 사용자는 이벤트의 두 종류의 수 :

    class User < ActiveRecord::Base
      has_many :active_event_users,   -> { active },   class_name: "EventUser"
      has_many :inactive_event_users, -> { inactive }, class_name: "EventUser"
    
      has_many :inactive_events, through: :inactive_event_user,
                                 class_name: "Event",
                                 source: :event
      has_many :active_events,   through: :active_event_users,
                                 class_name: "Event",
                                 source: :event
    end
    

    EventUser 모델 및 변경이 될 것입니다 :이 기술의 장점은 활성 또는 비활성 이벤트 인의 기능이 EventUser 모델에 속하고, 미래에 기능을 수정해야하는 경우, 그것은 단지 한 곳에서 수정 될 것입니다 다른 모든 모델에 반영.

  5. from https://stackoverflow.com/questions/408872/rails-has-many-through-find-by-extra-attributes-in-join-model by cc-by-sa and MIT license