限制基于丰富关系属性的关联

时间:2016-07-15 12:06:33

标签: ruby-on-rails ruby ruby-on-rails-3 simple-form slim-lang

这里的第一个问题!我试图将“关键公司”分配给我的用户。这些可在many-to-many富连接表中找到。在此表中,有newkeyactive等属性。我希望将公司分配给长列表中的用户,并使用SimpleForm

我希望过滤掉所有内容,并根据富关系中的属性限制关联关系。我为每个用户提供公司关系,但并非所有用户都是key - 关系或new - 关系。我只希望显示关联key而不触及其他关联。当我将这些公司分配给用户时,我还想将属性active设置为true。我的代码现在看起来像这样:

user.rb

class User < ActiveRecord::Base
    has_many :company_user_relationships
    has_many :companies, through: :company_user_relationships

company.rb

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

schema.rb

create_table "company_user_relationships", force: true do |t|
  t.integer  "company_id"
  t.integer  "user_id"
  t.boolean  "key"
  t.boolean  "active"
  t.datetime "last_contacted"
  t.string   "status_comment"
  t.datetime "created_at"
  t.datetime "updated_at"
  t.integer  "status"
  t.boolean  "new"
end

users_controller.rb

def assign_key_companies
    User.update(params[:users].keys, params[:users].values)
    redirect_to(:back)
end

查看

= form_for :user_companies,
        url: assign_key_companies_users_path,
        html: {:method => :put} do |f|
  - users.each do |user|
    = simple_fields_for "users[]", user do |u|
      tr
        td.col-md-4
          = "#{user.first_name} #{user.last_name}"
        td.col-md-8
          = u.association :companies, label: false, collection: @key_company_candidates,
                      input_html: {data: {placeholder: " Assign key companies"}, class: 'chosen-select'}
  = submit_tag "Save key companies", class: "btn btn-success pull-right"

我基本上只想显示user.companies.where(key: true)和SQL COMMIT,以便在更新记录时始终将key - 字段添加到true

如何过滤掉只会影响我想要的关联?

1 个答案:

答案 0 :(得分:0)

我可以想到两种方式。

首先在关联级别过滤它

class User < ActiveRecord::Base
    has_many :company_user_relationships, -> { where("company_user_relationships.key" => true) }

或者在哪里

user.companies.where("company_user_relationships.key" => true)

当你调用user.companies时,它实际上在所有三个表中都进行了连接表,所以你可以像我的例子一样指定条件。