【问题标题】:Model 2 way relationships to store id in user table将 id 存储在用户表中的模型 2 方式关系
【发布时间】:2014-03-05 10:37:37
【问题描述】:

我试图了解如何在创建一个模型记录时将其 ID 存储在单独的活动记录表(在本例中为用户表)中。

基本上,我有两个模型。一个has_many :taxes 的用户和一个belongs_to: user 的税务模型。在我的应用程序中,用户只能拥有一个税务记录,目前我通过将user.id 存储在税务模型的列中并检查之前的过滤器以查看用户是否已经创建了税务记录来实现这一点(检查他们的 user.id 是否在表中。)

create_table "taxes", force: true do |t|
    t.integer  "user_id"
    t.integer  "income"
    t.integer  "taxes"
    .....

请记住,这一切目前都在 index 操作中,这是毫无意义的,因为用户只能拥有一个税务记录,并且只能查看自己的税务记录。应该使用我假设的show 操作来完成。

现在的问题是,当用户创建他们的单一税务记录时,税务模型是这样设置的,所有这些都与税务活动记录表交互:

def store_raw_taxes
    tax = Tax.new(user_id: user.id, income: income, taxes: taxes, rrsp: rrsp)
    tax.save
end

为了使用show(并检查用户是否已经创建了税务记录),我想将tax_id 存储在他们所在行的实际用户表中。我创建了一个迁移AddTaxIdToUsers,它做了一个引用并向用户表添加了一个名为tax_id 的列。

我不知道如何将创建的税务记录的 ID 存储在用户表中。我猜这是一种双向关系,但我不明白在我的store_raw_taxes 函数中如何与用户模型进行交互。我猜它会在after_save 回调中完成?

在这种情况下,我还需要将belongs_to: tax 添加到用户模型吗?

【问题讨论】:

    标签: ruby-on-rails model-view-controller associations


    【解决方案1】:

    我会有点不同。

    在一对一关系中,您不需要belongs_to 定义,而是has_one

    在我看来,在概念上正确的做法是:

    user.rb:

    has_one :tax
    

    那么,你的方法是

    @user=User.find(..)
    @user.build_tax(income: income, taxes: taxes, rrsp: rrsp)
    

    【讨论】:

      【解决方案2】:

      基本上,我有两个模型。一个拥有_many :taxes 的用户和一个属于_to: 用户的税收模型。在我的应用程序中,一个用户只能有一个税务记录

      如果一个用户只能有一个税务记录,那么您不应该使用has_many :taxes,而是使用has_one :tax。 Rails 会自动处理所有事情。

      http://guides.rubyonrails.org/association_basics.html#the-has-one-association

      那么您将不需要“在过滤器之前查看用户是否已经拥有”。但是,您是否要确保用户始终拥有税务记录,您可以validates_presence_of :tax

      http://api.rubyonrails.org/classes/ActiveModel/Validations/ClassMethods.html#method-i-validates

      如果您使用嵌套形式,您可能根本不需要TaxesController

      此外,如果您使用嵌套形式,您将使用 accepts_nested_attributes,因此不再需要您的 store_raw_taxes 方法

      http://api.rubyonrails.org/classes/ActiveRecord/NestedAttributes/ClassMethods.html

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多