[RUBY-ON-RAILS] has_many 레일 : 찾기를 통해 모델을 가입에 추가 속성에 의해
RUBY-ON-RAILShas_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.어떻게 사용자 모델로이 같은 추가에 대한?
어떻게 사용자 모델로이 같은 추가에 대한?
has_many :active_events, :through => :event_users, :class_name => "Event", :source => :event, :conditions => ['event_users.active = ?',true]
그냥 호출하여 사용자에 대한 활성 이벤트를 얻을 수 있어야 그 후 :
User.first.active_events
-
==============================
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.당신의 u.events 명시 적으로 user_events 테이블을 호출되지 않은 경우에도, 그 테이블은 여전히 암시 때문에 필요한 조인의 SQL에 포함되어 있습니다. 그래서, 당신은 여전히 찾기 조건에 해당 테이블을 사용할 수 있습니다 :
당신의 u.events 명시 적으로 user_events 테이블을 호출되지 않은 경우에도, 그 테이블은 여전히 암시 때문에 필요한 조인의 SQL에 포함되어 있습니다. 그래서, 당신은 여전히 찾기 조건에 해당 테이블을 사용할 수 있습니다 :
u.events.find(:all, :conditions => ["user_events.active = ?", true])
당신이 있는지 확인 후 많은이 조회를 수행 할 계획이라면 물론, 밀란 Novota에서 알 수 있듯이 그것을 별도의 연결을 제공하지만, 당신이 그런 식으로 할에 대한 요구 사항은 없습니다
-
==============================
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 모델에 속하고, 미래에 기능을 수정해야하는 경우, 그것은 단지 한 곳에서 수정 될 것입니다 다른 모든 모델에 반영.
from https://stackoverflow.com/questions/408872/rails-has-many-through-find-by-extra-attributes-in-join-model by cc-by-sa and MIT license
'RUBY-ON-RAILS' 카테고리의 다른 글
[RUBY-ON-RAILS] 레일 : 인덱스 fields_for? (0) | 2020.02.08 |
---|---|
[RUBY-ON-RAILS] 레일에서 다른 웹 사이트로 컨트롤러에서 POST 데이터를 제출 (0) | 2020.02.08 |
[RUBY-ON-RAILS] 아니 경로 일치 [GET] / 자산 (0) | 2020.02.08 |
[RUBY-ON-RAILS] OmniAuth 및 페이스 북 : 인증서 확인 실패 [중복] (0) | 2020.02.08 |
[RUBY-ON-RAILS] 루비를 실행에 제한 / 창에 레일 (0) | 2020.02.08 |