Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/54.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails Rails ActiveRecord模型关联_Ruby On Rails_Activerecord_Model_Associations - Fatal编程技术网

Ruby on rails Rails ActiveRecord模型关联

Ruby on rails Rails ActiveRecord模型关联,ruby-on-rails,activerecord,model,associations,Ruby On Rails,Activerecord,Model,Associations,我有一个用户模型和一个产品模型 User has_many :products, :dependent => :destroy Product belongs_to :user, :foreign_key => "user_id", touch: true 我想为每个用户创建一个愿望列表。 因此,我必须创建一个具有适当关联的愿望列表模型。 但我不知道如何开始。 我假设愿望列表模型包含id、用户id和产品id字段 我是否必须通过关联使用has\u many或has\u和\u属于\u

我有一个
用户模型
和一个
产品模型

User has_many :products, :dependent => :destroy
Product belongs_to :user, :foreign_key => "user_id", touch: true
我想为每个用户创建一个愿望列表。 因此,我必须创建一个具有适当关联的
愿望列表模型。
但我不知道如何开始。
我假设愿望列表模型包含
id
用户id
产品id
字段

我是否必须通过关联使用
has\u many
has\u和\u属于\u many
? 我还想知道,如果一个用户被销毁了,就销毁他的愿望列表

最好的方法是什么?
非常感谢

您不需要
用户
上有很多:产品
关系。 我认为将
用户
产品
链接到
愿望列表之外是没有意义的

class Wishlist < ActiveRecord::Base
  has_many :products
  belongs_to :user
end

class User < ActiveRecord::Base
  has_one :wishlist, dependent: :destroy
end

class Product < ActiveRecord::Base
  belongs_to :wishlist
end
class-Wishlist
正如@JZ11所指出的,您不应该将产品直接链接到用户(除非用户出于某种原因实际“拥有”了产品)。但是,缺少的是构成愿望列表项的模型:

class User < ActiveRecord::Base
  has_many :wishlists       # or has_one, depending on how many lists a User can have...
end

class Product < ActiveRecord::Base
  has_many :wishlist_items
end

class Wishlist < ActiveRecord::Base
  belongs_to :user
  has_many :wishlist_items
  has_many :products, :through => :wishlist_items
end

class WishlistItem < ActiveRecord::Base
  belongs_to :product
  belongs_to :wishlist
end
class用户:愿望列表\u项
结束
类WishlistItem

当然,您应该在必要时添加
:dependent=>:destroy

要创建联接表,请执行以下操作:

rails g migration create_products_users_table
完成此操作后,需要在下面添加一些代码,以在联接表中创建字段。请注意
:id=>false
,因为在联接表中不需要id:

class CreateProductsUsersTable < ActiveRecord::Migration
  def change
    create_table :products_users, :id => false do |t|
      t.references :product
      t.references :user
    end
    add_index :products_users, [:product_id, :user_id]
    add_index :products_users, :user_id
  end
end
class CreateProductsUserTablefalse do | t|
t、 参考文献:产品
t、 参考资料:用户
结束
添加索引:products\u users,[:product\u id,:user\u id]
添加索引:产品\u用户,:用户\u id
结束
结束
上面的代码还创建了一些索引,并确保即使在数据库级别也没有重复的索引

然后,您的模型必须如下所示:

class Product < ActiveRecord::Base
  has_and_belongs_to_many :users
end

class User < ActiveRecord::Base
  has_and_belongs_to_many :products
end
类产品
当您正确地销毁一个用户时,如
user.destroy
而不仅仅是删除它(这是有区别的),那么联接表中的相关行也将被删除。这是ActiveRecord内置的

但是请注意,这样做并不能真正让您使用联接表。它将接受诸如
user.products=[product1,product2]
等代码和其他商品,但不会真正使用愿望列表


如果您确实想使用愿望列表,则必须以不同的方式创建和使用中间联接表,使用
has\u many:to
(我没有检查PinnyM的答案,但这可能是一种方法)。

好的,谢谢,这似乎是一个很好的解决方案。这一代模型正确吗?rails g model愿望列表用户\u id:integer产品\u id:integer?这有一个问题,产品不应该属于特定用户的愿望列表。。。当其他用户想要将产品添加到他们的愿望列表中时,你会怎么做?好的,我正在努力解决这个问题!谢谢但是我如何正确地生成愿望列表和愿望列表项模型呢?就我个人而言,我会手工“生成”它,这样我就可以确切地知道创建的内容、原因和位置。如果要使用模型生成器,可以运行:
rails g model Wishlist user\u id:integer
rails g model wishlistite\u id:integer product\u id:integer
。在每个模型上添加您可能需要的任何描述性字段。最后一件事。我不能在控制台中创建这样的whislit是正常的吗User.find(2).wishlist.create我必须做的事情是:wishlist.create(User\u id:2)@JonnyxDelavilla:如果您将关联定义为
有很多
(与上面的一样),您将使用:
User.find(2).wishlists.create(…)
。如果您将其更改为使用
has\u one:wishlist
,您将执行以下操作:
User.find(2).create\u wishlist(…)
。有关这方面的更多信息,请参阅。