Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/56.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.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中的关联帮助_Ruby On Rails_Ruby_Join_Associations_Inner Join - Fatal编程技术网

Ruby on rails Rails中的关联帮助

Ruby on rails Rails中的关联帮助,ruby-on-rails,ruby,join,associations,inner-join,Ruby On Rails,Ruby,Join,Associations,Inner Join,我在申请影评。用户可以滚动浏览已创建的不同评论,并将其保存到列表中。在我的控制台中,我无法访问用户的列表评论。User.list.reviews。我错过了什么?提前谢谢 以下是我当前的模型和关联 用户模型 has_one :list has_many reviews, :through => :list belongs_to :user has_many :reviews has_many :lists has_many :users, :through => :lists 列

我在申请影评。用户可以滚动浏览已创建的不同评论,并将其保存到列表中。在我的控制台中,我无法访问用户的列表评论。User.list.reviews。我错过了什么?提前谢谢

以下是我当前的模型和关联

用户模型

has_one :list
has_many reviews, :through => :list
belongs_to :user
has_many :reviews
has_many :lists
has_many :users, :through => :lists
列出型号

has_one :list
has_many reviews, :through => :list
belongs_to :user
has_many :reviews
has_many :lists
has_many :users, :through => :lists
审查模式

has_one :list
has_many reviews, :through => :list
belongs_to :user
has_many :reviews
has_many :lists
has_many :users, :through => :lists
模式:列表

user_id
review_id
模式:列表

user_id
review_id
这意味着您的列表属于一个用户,也属于一个评论。。。但您已经定义了如下列表关联:

belongs_to :user
has_many :reviews
所以Rails对为什么列表有一个review\u id(这是一个属于关联的东西)感到困惑。并且正在研究审查模型,希望它能有一个
list\u id
列。。。因为这就是你解决这个问题的方法。。。然而,您的审查模型有很多列表,因此它无法解决问题


你能告诉我们你到底希望发生什么吗?这些事情应该如何联系起来?我们是否应该更改您定义的关联以匹配id列,或者您是否可以更完整地指定模型之间的关系(例如使用对象图),然后我们可以告诉您如何更改id列/关联以匹配对象图?

在您的模式中,一个列表有一个用户ID和一个审查ID。所以一个列表只能有其中一个。但是您希望用户只有一个列表,而该列表有许多评论

然后它会变得更复杂,因为一个列表可以有很多评论。但由于许多不同的用户可以将评论放入自己的列表中,一个评论可能会出现在多个列表中。简言之,列表
拥有且属于多个:评论
和评论
拥有且属于多个:列表
。这意味着您需要在某个地方放置表示此关系的列表ID和审阅ID对—它称为联接表。约定只是将相关的两个表的两个名称连接起来,以获得联接表的名称-因此,如果我们有表
列表
审阅
,我们需要一个名为
列表_审阅
的联接表(您可以覆盖它,但使用约定更容易)

最低限度的Rails迁移将是:

create_table :users do |t|
end

create_table :lists do |t|
  t.belongs_to :user # Leads to "user_id" column
end

create_table :reviews do |t|
end

create_table :lists_reviews do |t|
  t.belongs_to :list   # Leads to a "list_id" column
  t.belongs_to :review # Leads to a "review_id" column
end
考虑到这一点,并考虑到使用
#has#u one
,您应该将
#belish#u to
放在它所拥有的东西中,所以列表应该
belish#u to:user
,我们得到:

class User < ActiveRecord::Base # Rails <= v4
  has_one  :list
  has_many :reviews, :through => :list
end

class List < ActiveRecord::Base
  belongs_to :user
  has_and_belongs_to_many :reviews
end

class Review < ActiveRecord::Base
  has_and_belongs_to_many :lists
  has_many :users, :through => :lists
end
class用户:列表
结束
所有这些都被放入一个空的Rails外壳中,我们可以在控制台上对其进行测试:

u1 = User.new; u1.save!
u2 = User.new; u2.save!

l1 = List.new( user: u1 ); l1.save!
l2 = List.new( user: u2 ); l2.save!

r1 = Review.new; r1.save!
r2 = Review.new; r2.save!
r3 = Review.new; r3.save!

l1.reviews << r1
l1.reviews << r2
l1.save!

l2.reviews << r2
l2.reviews << r3
l2.save!

u1.list
# => #<List id: 1, user_id: 1>
u1.list.reviews
# => #<ActiveRecord::Associations::CollectionProxy [#<Review id: 1>, #<Review id: 2>]>
u2.list
# => #<List id: 2, user_id: 2>
u2.list.reviews

# => #<ActiveRecord::Associations::CollectionProxy [#<Review id: 2>, #<Review id: 3>]>
l1.user
# => #<User id: 1>
l2.user
# => #<User id: 2>

r1.users
=> #<ActiveRecord::Associations::CollectionProxy [#<User id: 1>]>
r1.lists
=> #<ActiveRecord::Associations::CollectionProxy [#<List id: 1, user_id: 1>]>
r2.users
=> #<ActiveRecord::Associations::CollectionProxy [#<User id: 1>, #<User id: 2>]>
r2.lists
=> #<ActiveRecord::Associations::CollectionProxy [#<List id: 1, user_id: 1>, #<List id: 2, user_id: 2>]>
r3.users
=> #<ActiveRecord::Associations::CollectionProxy [#<User id: 2>]>
r3.lists
=> #<ActiveRecord::Associations::CollectionProxy [#<List id: 2, user_id: 2>]>
u1=User.new;救命!
u2=User.new;救命!
l1=列表。新建(用户:u1);救命!
l2=列表。新建(用户:u2);救命!
r1=回顾。新;救命!
r2=回顾。新;救命!
r3=回顾。新;救命!
l1.审查#
l1.用户
# => #
l2.user
# => #
r1.1用户
=> #
r1.1列表
=> #
r2.1用户
=> #
r2.1列表
=> #
r3.1用户
=> #
r3.列表
=> #

…它可以工作。

为此,您需要使用一个
has\u和\u属于\u many
。看一看

问题是您的列表模型有很多评论,而您的评论模型有很多列表。如果两个模型彼此都有很多关系,如何在数据库中对此进行建模?也就是说,您会将外键放在哪里?无论哪个表有外键,都只能有一个与另一个表的“属于”关系。i、 e.它只能属于另一个表上的一条记录


解决方法是使用联接表。在rails中,它通常有一个类似于
列表\u评论的名称。此联接表将有两个外键,一个用于列表表,另一个用于审阅。这样,每个表之间就可以有很多关系。在rails中,您可以使用
has\u和\u-allown\u-to\u-many
来实现这一点。查看上面的链接了解更多信息。

请简化您的问题,因为您在寻找什么….?对此表示抱歉。我正在尝试在我的应用程序中创建一个列表,其中包含来自我的审阅模型的审阅。每个用户都有一个列表,可以有多个评论。我一直在思考如何建立关联。我的列表表是具有review_id和user_id的联接表。目前,当我尝试访问用户列表中的评论时,我遇到了以下错误:reviews.list_id这样的列更有意义吗?很抱歉造成混淆。我认为您应该替换has\u many:has\u的列表模型上的评论,并且\u属于\u many。好的,混淆部分是有意义的。我正试图让一个用户拥有一个列表,其中可以包含他们想要的任意多个评论。此外,一个评论可以包含在多个用户的列表中。一条要跟进的评论-上述内容还意味着您可以将
has_One
更改为
has_many
,从而
has_many:reviews,:through=>:list
,注意
列表中的复数形式
。现在,用户将拥有列表,而不仅仅是一个列表。您不需要更改数据,但您将拥有
user.list
而不是
user.list
。您可以这样做,例如,
user.list[0]。评论
而不仅仅是
user.list.reviews
,而
user.reviews
将返回用户拥有的每个列表中的所有评论的完整集合。您可能永远不希望允许一个用户有多个列表,但很高兴知道这是一个简单的更改!谢谢你,安德鲁!非常有帮助。不用担心,当我离开Rails/更有趣的关联一段时间后,我发现这种东西真的很有用。