【问题标题】:using a has many and has one association on the same model使用 a 在同一个模型上有多个和一个关联
【发布时间】:2014-09-25 01:37:45
【问题描述】:

我希望我的用户对象能够与许多地址相关联,并将其中一个地址作为主地址。

我试图在不使用布尔值表示主地址的情况下执行此操作,而是同时使用 has-many 和 has-one 关联 - 根据 PinnyM 在以下 SO 中的第一种方法:Rails model that has both 'has_one' and 'has_many' but with some contraints

但我似乎无法让它工作。

我的迁移:

class User < ActiveRecord::Migration
    def change
        create_table(:users) do |t|
            t.integer :primary_address_id
            t.string :name
        end
    end
end

class Address < ActiveRecord::Migration
    def change
        create_table(:addresses) do |t|
            t.integer :user_id
            t.string :address
        end
    end
end

我的模型:

class User
    has_many :addresses
    has_one :primary_address, :class_name => "Address"
end

class Address
    belongs_to :user
    has_one :user
end

这允许我通过执行 user.addresses 来使用 has_many 关联,但我似乎无法访问只有一个关联。我试过这样做:

 user.primary_address
 user.addresses.primary_address 
 user.addresses.primary_address.first

我真的不明白如何正确设置这些关联或如何访问它们。非常感谢您的帮助!

【问题讨论】:

    标签: ruby-on-rails-4 associations


    【解决方案1】:

    刚刚创建了您正在使用的模型和关联。我不明白为什么它在您的情况下不起作用,因为我可以访问 primary_address。这是我用来使用 rails 控制台访问它的代码。注意:我已经提前创建了一个用户和几个地址。

    # in case if you have user with id = 1    
    User.find(1).primary_address
    # or another example
    User.first.primary_address
    

    我认为您的协会不会允许这种调用:

    user.addresses.primary_address 
    user.addresses.primary_address.first
    

    【讨论】:

    • 嗯,有道理。我只是错误地访问它们。我不太了解主要地址的 has_one 关联的设置。为什么 User 和 Address 模型上都有 has_one ? Address 上的 has_one 和 User 上的 belongs_to 对我来说更有意义。有什么想法为什么会这样设置?
    • 实际上,在这种特殊情况下,您并不需要 Address 模型中的 has_one 。您需要belongs_to 才能执行Address.first.user (访问该地址所属的用户)之类的操作,但不需要has_one。我在测试时没有使用它。这也是因为不是每个地址都会成为主地址。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多