范围协会和公寓宝石

时间:2015-11-26 06:03:40

标签: ruby-on-rails activerecord ransack apartment-gem

我希望我能正确解释一下。

我有以下内容:

class User < ActiveRecord::Base
  has_many :enrollments
  has_many :companies, through: :enrollments, dependent: :destroy

class Enrollment < ActiveRecord::Base
  belongs_to :user
  belongs_to :company

class Company < ActiveRecord::Base
  has_many :enrollments
  has_many :users, through: :enrollments

这些都是公寓宝石的公共租户。公司是租户。这里的想法是用户通过注册与公司相关联。我在注册中有其他信息,所以我没有使用STI。

我可以调用current_user.enrollments等,但我真正想要的是一个has_one类型关联,您可以从当前租户那里获得注册。

我补充说:

  def enrollment
    company = Company.where(tenant_name: Apartment::Tenant.current).last
    company.enrollments.where(user_id: self.id).last
  end

在调用时有效,但您无法使用Ransack等进行搜索

对于Ransack,enrollments_somefield_eq=somevalue之类的查询工作正常,但它会搜索所有注册但我只想要当前公司的注册。我已经看到你可以在哪里为协会添加一个条件,但我不认为我可以在模型中获得租户ID来使用它。

这里有什么想法吗?

更新

我在这附近 - 经过大量谷歌搜索后,我拼凑了这个:

has_many :active_enrollments, -> { joins(:company).where("companies.tenant_name = '#{Apartment::Tenant.current}'") }, class_name: 'Enrollment'

我真的想要:

has_one :active_enrollment, -> { joins(:company).where("companies.tenant_name = '#{Apartment::Tenant.current}'").last }, class_name: 'Enrollment'

但这不起作用。因为每个公司和用户实际上只有一个注册。这可能足够接近因为我可以通过ransack查询active_enrollments并且应用范围等。

1 个答案:

答案 0 :(得分:0)

我忘了我已经问过了,我已经在这里回答了:

Scoping an association search with Ransack