我有两个模型Item
和User
。 Item
由User
创建并拥有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
的{{1}}的所有权。
add_reference :items, :user, index: true
add_foreign_key :items, :users
这意味着我可以Item
访问item.user_id
的所有者。我还可以使用item.users
和user.items
访问用户和项目的多对多关系。
我不知道如何通过User
对象访问User
拥有的项目。 User
拥有的项目应与user.items
的多对多关系中的项目不同。
我觉得我正在构建错误的一切。我对rails非常陌生,我很困惑。在rails中实现这个目的的正确方法是什么?
答案 0 :(得分: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
答案 1 :(得分:0)
我确信通过用户和项目的多对多关联,您可以解决,但如果您想要更清晰的解决方案,您必须&#34; traslate&#34;你在数据模型中的想法(oob方式)。
您告诉我们:项目拥有所有者,即用户,并且拥有许多用户。因此,您需要所有者模型并构建has_one :throught association
例如,对于Item模型,您可以设置:
>has_many :users
>has_one :user throught :owners
>has_one :owner
对于用户模型,您可以设置:
>has_many :items
>belongs_to :owner
对于所有者模型,您可以设置:
>has_one :user
>belongs_to :item