【问题标题】:Rails: Select from multiple modelsRails:从多个模型中选择
【发布时间】:2015-02-02 03:20:34
【问题描述】:

在我的 Rails 应用程序中,我有一个工作模型

belongs_to :company
belongs_to :organization

我想在同一字段中下拉所有公司名称和组织名称的名单,所以我想知道这是否可能实际上我只是在添加组织之前使用公司名称,我有这个我的工作表中的代码

<%= f.text_field :company_name, data: {autocomplete_source: Company.order(:name).map(&:name) },required: true %>    

这在我的工作模式中

def company_name
  company.try(:name)
end

def company_name=(name)
   self.company = Company.where(name: name).first_or_create
end

【问题讨论】:

  • 把逻辑放在眼里是不好的做法。

标签: ruby-on-rails ruby ruby-on-rails-4 activerecord models


【解决方案1】:

我不太了解公司和组织之间的区别。我假设公司和组织彼此没有关系。因此,您可以将这两个集合合并。

<% companies_and_organizations = (Company.all.pluck(:name) + Organization.all.pluck(:name)).sort %>
<%= f.text_field :company_name, data: {autocomplete_source: companies_and_organizations}, required: true %>

然后我假设您只分配一个或另一个字段。在这种情况下,如果所选名称与现有公司或组织不匹配,则创建公司:

def company_name
  (company || organization).try(:name)
end

def company_name=(name)
   company_or_organization = Organization.where(name: name).first
   company_or_organization ||= Company.where(name: name).first_or_create
   self.company = company_or_organization
end

【讨论】:

  • 是的,组织和公司之间没有关系,它们是两种不同的模型。我会试试你的代码,但你能告诉我如果记录不存在,它将被创建为公司或组织或两者兼而有之??
  • 请注意,我编辑了这个(我在where 检查中错过了||)。在代码中,如果记录不存在,我选择创建公司。我不知道你喜欢做什么;您可以交换组织/公司where 子句。只要确保你first_or_create最后一个。
  • 另外,如果您想知道.pluck(:name).map(&amp;:name)(您使用的那个)类似,只是它只返回数据库中的一个字段,而不是加载每条记录并实例化一个对象。如果您有很多公司或组织,那么性能会有所提高。
猜你喜欢
  • 2021-12-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-08
相关资源
最近更新 更多