【问题标题】:Rails4 : find or create methodRails4:查找或创建方法
【发布时间】:2014-12-03 17:14:07
【问题描述】:

我的 rails 应用程序有一个自动完成功能供用户选择,他们可以在其中选择公司或创建新公司公司显示页面,当用户放置一个不存在的公司时,我想要类似linkedin的东西,它不会被创建但会在配置文件中实际上我的代码是这样的

def company_name
  company.try(:name)
end

def company_name=(name)
  self.company = Company.find_or_initialize_by(name: name) if name.present?
end

<%= f.label :company_name, class: "jobs-newtitles" %><br />
<%= f.text_field :company_name, data: {autocomplete_source: Company.order(:name).map(&:name) },required: true,:autocomplete => :off, class: "form-control form-newjob" %>

我尝试将Company.find_or_initialize_by 更改为Company.find_by 但这不起作用,任何人都可以指导我如何实现这一目标

【问题讨论】:

  • 你试过 find_by_name 吗? find by it 自己查找 id,find_by_name 应该可以工作
  • @NickCatib find_by_name 和所有 find_by_* 均已弃用。使用find_by(name: name)
  • 是的,我的错... DickieBoy 解决方案要好得多。将其发布为答案:)
  • @DickieBoy find_by_name 不折旧。见Rails 4 Release Notes。摘录:“除 find_by_... 和 find_by_...! 之外的所有动态方法均已弃用”。这已经发生了很多,所以我会尽可能地向每个人指出。许多动态查找器已被贬值,但find_by_... 不是其中之一。 find_all_by_... 虽然已经和其他一些人在一起了。
  • @DickieBoy 我没有明确的理由对 Rails 开发人员来说是个问题,但这可能与这些方法产生对象实例的事实有关,其中许多可以使用生成 ActiveRecord::Relation 的 where 子句来重写折旧的方法。我认为find_or_initialize_by_...find_or_create_by_... 已被贬值,因为将find_by()first_or_[initialize/create] 结合使用会产生相同的结果,而find_or_[create/initialize]_by() 则更加灵活。但这些只是假设。

标签: ruby-on-rails ruby ruby-on-rails-4 associations


【解决方案1】:

如果您的问题在于如何按照您的描述设计系统,那么我至少可以看到两个选项

  • Company 模型添加更多元数据

has_profile添加到Company,并且只对通过用户关联创建的公司设置为false。然后在您需要的任何地方进行相应的过滤。根据您的域的工作方式,处理过滤可能会有些痛苦,我建议远离默认范围。

  • 为关联公司使用不同的模型

User 有许多AssociatedCompany,它们可以有自己的数据,例如名称和大小,并且可能属于Company。如果AssociatedCompany 属于Company,那么您可以通过在其中定义检查它是否存在的方法,从Company 中提取名称等数据,如果不存在,则使用AssociatedCompany 中的名称属性。

从代码的角度来看,对于 Rails 4,我建议使用

Model.where(name: name).first_or_initialize
# or
Model.where(name: name).first_or_create

http://apidock.com/rails/ActiveRecord/Relation/first_or_initialize http://apidock.com/rails/ActiveRecord/Relation/first_or_create

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-04-26
    • 2020-01-20
    • 1970-01-01
    • 2013-07-28
    • 1970-01-01
    • 1970-01-01
    • 2017-02-27
    • 2013-12-17
    相关资源
    最近更新 更多