【问题标题】:concatenate two active record results (through join table) to return a new result连接两个活动记录结果(通过连接表)以返回一个新结果
【发布时间】:2012-01-03 21:28:16
【问题描述】:

我有以下:

Account --> Options
Account --> Profiles --> Options

这是模型

# models/account.rb
class Account < ActiveRecord::Base
  has_many :accounts_has_options
  has_many :options, :through => :accounts_has_options
  has_many :accounts_has_profiles
  has_many :profiles, :through => :accounts_has_profiles
end

# models/profile.rb
class Profile < ActiveRecord::Base
  has_many :profiles_has_options
  has_many :options, :through => :profiles_has_options
  has_many :accounts_has_options
  has_many :accounts, :through => :account_has_options
end

# models/option.rb
class Option < ActiveRecord::Base
  has_many :accounts_has_options
  has_many :accounts, :through => :accounts_has_options
  has_many :profiles_has_options
  has_many :profiles, :through => :profiles_has_options
end

我希望将所有选项与帐户关联,并通过配置文件关联所有选项,可能在虚拟属性中。

我在该问题中找到了一个示例: How do you concatenate two active record results to return a new result that can further be filtered? 但他们只关心两个模型,在我的例子中,我们在故事中有一个连接表。

任何想法,如何编写这样的虚拟属性?

【问题讨论】:

  • 您是否尝试过该问题的建议?我看不出它不起作用的任何特殊原因。

标签: ruby-on-rails activerecord model


【解决方案1】:

如何将这样的方法添加到您的 Account 模型中

def all_options
    profile_option_ids = []
    self.profiles.map{|p| profile_option_ids = profile_option_ids + p.options.pluck("options.id")}
    Option.where("id IN (?) or id IN (?)", self.options, profile_option_ids)
end

所以你只需要打电话

account.all_options

【讨论】:

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