【问题标题】:Build Rails Object From 2 has_and_belongs_to_many Associatons从 2 个 has_and_belongs_to_many 关联构建 Rails 对象
【发布时间】:2014-01-20 06:13:02
【问题描述】:

目前,我使用 has_and_belongs_to_many 关联在我的应用中定义了两个模型,Accounts 和 Users。

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

我能够轻松获取当前用户,但如果当前用户有多个帐户,我正在努力寻找一种方法来构建一个对象来存储当前帐户。

现在我默认使用属于当前用户的第一个帐户,我猜测解决方案将是在我定义的路由中包含所选帐户 id 参数,但我不是真的很确定该怎么做,因为我对 RoR 还很陌生,如果可能的话,我更愿意在幕后设置它,而不在 URL 中显示帐户 ID。

编辑 - 添加代码

models/account.rb

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

    #...
end

models/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 帮助器方法不再有效,因为我已经将我的关联从 Account has many Users 和 Users belongs to Account 更改为 Accounts has and属于 many Users,反之亦然。现在我已经将上面的代码更新为

@current_account ||= current_user.accounts[0]

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

我也在使用 devise,所以我可以利用他们的 current_user 辅助方法轻松获取当前用户。

任何帮助将不胜感激!

【问题讨论】:

  • 您能否提供一些示例代码来说明您要做什么?列出所有连接到关系的模型。一开始,Habtm 关系似乎是灵丹妙药,但结果往往是有一个更简单的答案。
  • @Saifis - 更新了我迄今为止实施的问题。

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


【解决方案1】:

对不起,我一直很忙。

从源头开始,您可能不需要 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

Account 模型将是您所说的中间表(它可能被称为其他首先想到的东西)并且将保存与组织相关的用户,反之亦然, 它可以保存不属于用户或组织的内容,例如特定于组织的帐号或 user_type。

这里有一个关于多对多关联的Railscast,如果您不熟悉rails 上的多对多。

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

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

【讨论】:

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