从2个has_and_belongs_to_many关联构建Rails对象

时间:2014-01-20 06:13:03

标签: ruby-on-rails ruby-on-rails-3 has-and-belongs-to-many

目前,我已使用has_and_belongs_to_many关联在我的应用中定义了两个模型,即帐户和用户。

应用内的帐户指的是公司等组织。

我能够轻松获得当前用户,但如果当前用户有多个帐户,我很难找到构建存储当前帐户的对象的方法。

现在我默认为属于当前用户的第一个帐户,我猜测解决方案将在我定义的路径中包含所选帐户ID参数,但我不是我确实知道如何做到这一点,因为我对RoR还不熟悉,如果可能的话,我更愿意在幕后进行设置,而不会在URL中显示帐号ID。

修改 - 添加代码

模型/ account.rb

class Account < ActiveRecord::Base
    #define relationship to users
    has_and_belongs_to_many :users

    #...
end

模型/ user.rb

class User < ActiveRecord::Base
    #define relationship to account
    has_and_belongs_to_many :accounts

    #...
end

**在将帐户和用户关联更新为habtm之前的先前'current_account'实现。

控制器/ application_controller.rb

class ApplicationController < ActionController::Base
    protect_from_forgery
    helper_method :current_account

    private

    def current_account
        if user_signed_in?
            @current_account ||= Account.find(current_user.account_id)
        end
    end
end

上面的current_account帮助方法不再有效,因为我已经从帐户更改了关联,许多用户和用户属于帐户到帐户,并且属于许多用户,反之亦然。现在我已经将上面的代码更新为

@current_account ||= current_user.accounts[0]

但显然这仍然是一个静态变量,我需要它是动态的,具体取决于用户选择的帐户。

此外,我正在使用设计,因此我可以利用他们的current_user帮助方法轻松获取当前用户。

非常感谢任何帮助!

1 个答案:

答案 0 :(得分:0)

抱歉,我一直很忙。

从源头开始,你可能不需要habtm,即使你这样做,你似乎错过了中间表来保持两个模型之间的关联。你需要一个habtm的唯一方法是当一个帐户有几个用户时,这看起来有点奇怪。

帐户

class Account < ActiveRecord::Base
    belongs_to :user
end

用户

class User < ActiveRecord::Base
    has_many :users
end

似乎更好。

然而,让我继续猜测你想要得到什么,

可能你想要定义一个组织,并将几个用户连接到它,你需要habtm,模型就是这样,

用户

class User < ActiveRecord::Base
  has_many :accounts
  has_many :organizations, through: :accounts
end

组织

class Organization < ActiveRecord::Base
  has_many :accounts
  has_many :organizations, through: :accounts
end

帐户

class Account < ActiveRecord::Base
  has_many :users
  has_many :organizations
end

帐户模型将是您所谓的中间表(它可能被称为首先考虑的其他事项)并且将保留哪个用户与组织相关,反之亦然, 它可以保存不属于用户或组织的内容,例如组织特定的帐号或user_type。

如果您对轨道上的许多人不熟悉,请参阅Railscast关于此处的多对多关联。

许多关系的提示和注意事项不受Rails的限制,所以如果你不熟悉它们,我建议在互联网上查找关于它们的信息,关系数据库作为关键字。

希望这可以指出正确的方向,如果您需要更多帮助,请发表评论。