ruby-on-rails - 连接两个事件记录结果(通过连接表)以返回一个新结果

标签 ruby-on-rails activerecord model

我有以下内容:

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? 但他们只涉及两个模型,在我的例子中,我们在故事中有一个连接表。

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

最佳答案

如何将这样的方法添加到您的帐户模型

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

关于ruby-on-rails - 连接两个事件记录结果(通过连接表)以返回一个新结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8227782/

相关文章:

ruby-on-rails-3 - 如何使用Arel制作一个不会影响Rails 3中查询的ActiveRecord范围?

ruby-on-rails - Rails 模型 attr_accessor 属性没有保存?

php - CakePHP 中缺少数据库表,我遵循惯例并尝试了所有方法

java - Java EE 中的动态类型表/模型?

ruby-on-rails - ruby on rails 中的下拉列表表单验证警报

javascript - 在 Rails 中调用 javascript 函数 onclick

mysql - 无法在 Rails 3.1.11 的事件记录中查询 "group"

javascript - 将 ProfileImage 添加到照片 Controller

ruby-on-rails - Rails Model.create SQLite3::SQLException

ruby-on-rails - 如何测试carrierwave文件是否更改?