2015-04-27 30 views
1

我有兩個型號ItemUserItemUser創建並擁有。但Item也擁有除擁有者以外的用戶。鋼軌多對多,一到多擁有

看來我需要項目和用戶之間的多對多關係。但是另外,我還需要一個擁有很多項目的用戶的一對多的所有權關係。

class User < ActiveRecord::Base 
    has_many :items, dependent: :destroy 
    has_and_belongs_to_many :items 
end 

class Item < ActiveRecord::Base 
    belongs_to :user 
    has_and_belongs_to_many :users 
end 

我已經建立了像這樣的遷移。

用於保存用戶和項目之間的許多連接的表格。

create_table :items_users, :id => false do |t| 
    t.column :item_id, :integer 
    t.column :user_id, :integer 
end 

除了一個Item的由User所有權。

add_reference :items, :user, index: true 
add_foreign_key :items, :users 

這意味着我可以item.user_id訪問Item的所有者。我還可以通過item.usersuser.items訪問用戶和項目之間的多對多關係。

我不知道如何通過User對象訪問User擁有的項目。 User擁有的物品應與user.items的多對多關係中的物品不同。

我覺得我正在構造一切錯誤。我非常新的軌道,我很困惑。在rails中完成這個操作的正確方法是什麼?

+0

在現實世界中,其他用戶關係是什麼?原因是你可以根據情景對其進行不同的構造:或者與同一模型保持兩個單獨關係,或者與連接表有一個多對多關係,描述該用戶對該特定項目的「角色」(所以你'有一個「創造者」的角色,以及任何你需要的東西)。然後,您可以在模型中定義不同的'has_many'關係,根據該角色進行過濾。 –

回答

2
class User < ActiveRecord::Base 
    has_many :user_items, dependent: :destroy 
    has_many :items, through: :user_items 

    has_many :owned_items, through: :user_items, source: item, where: -> { 
    user_items: {owned: true} 
    } 
end 

class Item < ActiveRecord::Base 
    has_many :user_items, dependent: :destroy 
    has_many :users, through: :user_items 
end 

class UserItem < ActiveRecord::Base 
    belongs_to :user 
    belongs_to :item 

    scope :owned, -> { 
    where(owned: true) 
    } 
end 

create_table :user_items |t| 
    t.references :user 
    t.references :item 
    t.boolean :owned, null: false, default: false 
end 
+0

@ilan_berci我對於'''scope:owned, - > {where(owned:true)}'''的工作方式有些困惑。感謝您的迴應。我認爲這種方法最有意義。 – jpittis

+1

如果您不想使用範圍,則不必使用範圍。我只是想說明,如果你的關聯表包含該屬性,rails將處理大部分細節 –

+0

@ilan_berci在閱讀完一段文字後,作用域非常合理。最後要理解的是'''source:item do''''我明白合併是爲了找到所有擁有的用戶項目和交叉點?我不完全確定什麼'''item''''是爲了引用。再次感謝Ilan! – jpittis

0

我確定使用User和Item中的多對多關聯可以解決問題,但是如果您想要更清晰的解決方案,則必須在數據模型(oob方式)中「traslate」您的想法。

你告訴我們:Item有一個所有者,這是一個用戶,並且有很多用戶。所以,你需要一個用戶模型,並建立一個has_one :throught association

例如,對於項目模型,你可以設置:

>has_many :users 
>has_one :user throught :owners 
>has_one :owner 

對於用戶模型,你可以設置:

>has_many :items 
>belongs_to :owner 

所有者模型,你可以設置:

>has_one :user 
>belongs_to :item 
+0

用戶和「所有者」/「創建者」在OP場景中是相同的類別,唯一的區別是項目和用戶之間的關係。 「所有者」/「創造者」更多地是對關係的描述,而不是完全不同的領域模型。 –

+0

@PaulRichter我和你一起深入探討什麼是真正的關係。但在jpittis描述的簡單情況下,我認爲把「特殊」用戶作爲「創造者/所有者」是一個很大的「小」步驟。那麼,我真的不是一個大的專家,只有我的2cents希望它可以幫助:) –

+0

你認爲擁有一個可能最終擁有零邏輯的Owner類更好嗎?或者,我應該使用下面的技巧創建一個UserItem,指定關係是否爲所有者。我傾向於下面的一個。多謝你們。 – jpittis