【问题标题】:has_many :through relationships explainedhas_many :通过关系解释
【发布时间】:2012-12-14 23:40:04
【问题描述】:

我是 Rails 新手,对我需要使用哪种关系有一些疑问。情况就是这样。

我有两个模型 Offer 和 User,一个用户可以属于多个 Offer,Offers 可以有多个用户。用户也可以创建优惠。

我想我必须使用 has_many :through rationship。例如,我创建了另一个模型“申请人”。申请人属于_to 用户和belongs_to 报价。但是用户和报价模型的关系如何?例如:

用户模型

 has_many :offer, :through => :applicant

报价模式

 has_many :user, :through => :applicant

我的怀疑是因为我已经有了这两个关系

用户模型

has_many :offers, :dependent => :destroy

报价模式

belongs_to :user

解决这个问题后,我客我必须从applicanst_controller保存申请模型中的记录,对吧?

提前致谢

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-3 ruby-on-rails-3.2


    【解决方案1】:

    您所描述的是使用连接表的many-to-many 关系。您实际上非常接近,但您只需要从您的用户模型中删除 has_many :offers, :dependent => :destroy 并在您的报价模型中删除 blongs_to :user 。它应该看起来像这样:

    class User < ActiveRecord::Base
      has_many :offers, :through => :applicants
    end
    
    class Applicant < ActiveRecord::Base
      belongs_to :users
      belongs_to :offers
    end
    
    
    class Offer < ActiveRecord::Base
      has_many :users, :through => :applicants
    end
    

    您不必担心相关的销毁部分,因为关联会随着相应对象的删除而自动删除。对于多对多关联,如何建立关系并不重要。以下任一方法都可以:

    @user.offers << @offer
    
    @offers.users << @user
    

    如果您不需要存储任何特定于申请人联接表的信息(例如时间戳、描述),您可能希望查看 has_and_belongs_to_many 关系。查看choosing between has_many_through and has_and_belongs_to_many 以供参考。

    编辑

    以下是 HABTM 关系的代码:

    class User < ActiveRecord::Base
      has_and_belongs_to_many :offers
    end
    
    
    class Offer < ActiveRecord::Base
      has_and_belongs_to_many :users
    end
    

    【讨论】:

    • 谢谢 Cyle,但我有另一个问题......用户创建了报价,我使用用户 has_many 报价和报价属于_to 用户来关联记录,所以如果我删除此关联,这不会会影响,当用户创建报价???申请者模型只是为了知道什么用户申请什么优惠
    • 使用我推荐的第一个解决方案,如果您删除优惠,则没有用户将与该优惠有关联,并且关联的用户对象将保留,反之亦然。如果您不希望存储有关申请人的任何额外信息,您可能需要考虑使用 HABTM 解决方案,请参阅我的更新答案。如果您希望删除关联的用户对象及其关联的商品,您可以使用 :autosave 选项以及 HABTM 关联,​​如here 所述
    • 当然我不需要存储任何其他信息,我只需要该用户仍然可以创建优惠,其他用户可以申请任何优惠。所以我必须更改为 HABTM,但在我进行此更改后,我收到此错误 SQLite3::SQLException: no such table: offer_users: SELECT "users".* FROM "users" INNER JOIN "offers_users" ON "users"。 id" = "offers_users"."user_id" WHERE "offers_users"."offer_id" = 1
    • 算了,我创建了 del 模型 offer_users,我认为一切都很好,让我检查一下,但我知道我不知道如何创建申请者。我认为我做错了什么,因为这个表只是创建了用户和报价之间的关系,但没有申请人
    猜你喜欢
    • 1970-01-01
    • 2011-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-24
    • 2012-06-12
    • 2011-09-11
    • 1970-01-01
    相关资源
    最近更新 更多