导致多对多和一对多的所有权

时间:2015-04-27 16:35:48

标签: ruby-on-rails ruby-on-rails-4

我有两个模型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的{​​{1}}的所有权。

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

这意味着我可以Item访问item.user_id的所有者。我还可以使用item.usersuser.items访问用户和项目的多对多关系。

我不知道如何通过User对象访问User拥有的项目。 User拥有的项目应与user.items的多对多关系中的项目不同。

我觉得我正在构建错误的一切。我对rails非常陌生,我很困惑。在rails中实现这个目的的正确方法是什么?

2 个答案:

答案 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