【问题标题】:Ruby on Rails Join Table AssociationsRuby on Rails 加入表关联
【发布时间】:2010-05-10 12:25:33
【问题描述】:

我有一个像这样的 Ruby on Rails 应用程序设置:

用户模型

has_and_belongs_to_many :roles

榜样

has_many :transactions
has_and_belongs_to_many :users

交易模型

belongs_to :role

这意味着使用了一个名为roles_users的连接表,也意味着用户只能看到通过角色分配给他们的事务,用法示例:

user = User.find(1)
transactions = user.roles.first.transactions

这将返回与分配给用户的第一个角色相关联的事务。如果一个用户有 2 个角色分配给他们,目前要获取与第二个角色关联的事务,我会这样做:

transactions = user.roles.last.transactions

我基本上是想找出一种建立关联的方法,以便我可以根据用户和角色之间的关联中定义的角色通过类似的方式获取用户的交易:

user = User.find(1)
transactions = user.transactions

我不确定这是否可能?我希望你能理解我想要做什么。

【问题讨论】:

    标签: ruby-on-rails ruby activerecord associations


    【解决方案1】:

    如果您不想执行单独的 SQL 查询来查找每个角色的事务,您可以先获取用户的 role_ids,然后通过单个查询查找具有这些角色 id 的所有事务:

    class User < ActiveRecord::Base
      #...
      def transactions
        Transaction.scoped(:conditions => {:role_id => role_ids})
      end
    end
    

    Transaction.scoped 在这里使用,因此您可以在必要时添加更多条件,例如

    user.transactions.all(:limit => 10, :conditions => [ ... ])
    

    【讨论】:

    【解决方案2】:

    您可以将一个方法添加到 Usercollect 将每个用户角色的事务添加到一个数组数组中,然后将 flatten 这个添加到一个数组中:

    class User < ActiveRecord::Base
      def transactions
        user.roles.collect { |role| role.transactions }.flatten
      end
    end
    

    【讨论】:

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