2011-10-14 2 views
0

레일에서 기본 모델 연결을 시도하고 있습니다. 기본적으로 item_id 및 user_id를 저장하는 List 테이블이 있습니다.레일 기본 ​​연결

한 사용자가 여러 개의 "목록 항목"을 만들 수 있습니다.

올바른 방법인가요?

감사합니다.

class Item < ActiveRecord::Base 
    has_many :users, :through => :lists 
end 

class User < ActiveRecord::Base 
    has_many :items, :through => :lists 
end 


class List < ActiveRecord::Base 
    belongs_to :user 
    belongs_to :item 
end 
+0

네, 그게 효과가 있습니다. 또는'belongs_to : list' 아이템,'belongs_to : user'와'has_many : items' 아이템, 사용자'has_many : lists' 아이템을 가질 수 있습니다. –

답변

1

도달하려는 항목에 따라 솔루션이 올바른지 여부입니다. 다음과 같은 경우가 표시됩니다.

  1. 항목과 사용자간에 n : m 연관을 만들고 싶습니다. 따라서 각 항목은 많은 사용자가 참조 할 수 있으며 각 사용자는 많은 항목을 참조합니다. 이것이 올바른 맥락이면 솔루션이 올바른 것입니다. 자세한 내용은 Rails Guides: Associations을 참조하십시오.
  2. 해당 상황의 대안은 has_and_belongs_to_many Association 일 수 있습니다. 상황은 동일하지만 목록에 대해 이야기하는 것이 타당하지 않습니다. 모델 개체는 없습니다.
  3. 각 사용자가 많은 목록을 가지고 있고 각 목록에 많은 항목이있을 수있는 경우 솔루션이 잘못됩니다. 이것은 n : m과 list 사이의 조인 테이블로 연관되지만, 두 개의 1 : n 관계는 아닙니다.

세 번째 예를 들어 코드가 같을 것이다

최초의 솔루션에서
class User < ActiveRecord::Base 
    has_many :items, :through => :lists 
    has_many :lists 
end 

class List < ActiveRecord::Base 
    has_many :items 
    belongs_to :user 
end 

class Item < ActiveRecord::Base 
    belongs_to :list 
end 

, 당신은 목록에 목록 및 항목에 대한 사용자의 관계를 추가해야합니다 :

class Item < ActiveRecord::Base 
    has_many :lists 
    has_many :users, :through => :lists 
end 

class User < ActiveRecord::Base 
    has_many :lists 
    has_many :items, :through => :lists 
end 
0

"목록"엔티티가 진정 순수 연결/조인 인 경우, 즉 고유 한 고유 속성이 없으면 조금 단순화하고 has_and_belongs_to_many를 사용할 수 있습니다. 그렇다면 "List"클래스는 필요 없습니다.

class Item < ActiveRecord::Base 
    has_and_belongs_to_many :users 
end 

class User < ActiveRecord::Base 
    has_and_belongs_to_many :items 
end 

레일에 "items_users"테이블에 대한 참조를 찾습니다, 마이그레이션에, 그래서 당신이 그것을 만들 필요가 라 :

create_table :items_users, :id => false do |t| 
    t.references :users, :items 
end 

많은 사람들이 항상 has_many을 사용하는 당신을 말할 것이다 : 그러나 나 같은 다른 사람들은 동의하지 않을 것입니다 - 일에 적합한 도구를 사용하십시오.