小编yba*_*art的帖子

ActiveRecord find_or_build_by

我想表演:

    XXX.find_or_build_by_language_id(attributes)
Run Code Online (Sandbox Code Playgroud)

我发现

    XXX.find_or_initialize_by_language_id(attributes)
Run Code Online (Sandbox Code Playgroud)

但这只设置了language_id而没有其他属性.即使我手动设置属性,当我执行XXX.save时也不会保存记录.

我只是阅读Rails - 查找或创建 - 是否有查找或构建?,这似乎与我的问题有关,但不符合我的需要.

编辑

让我们使用这个场景

# db/migrations/create_models.rb
class CreateModels < ActiveRecord::Migration
  def self.up
    create_table :companies do |t|
      t.string :name
    end

    create_table :employees do |t|
      t.string :name
      t.string :city
      t.references :company
    end
  end
end
Run Code Online (Sandbox Code Playgroud)

-

# app/models/employee.rb
class Employee < ActiveRecord::Base
  belongs_to :company
end
Run Code Online (Sandbox Code Playgroud)

-

# app/models/company.rb
class Company < ActiveRecord::Base
  has_many :employees
end
Run Code Online (Sandbox Code Playgroud)

-

# rails console
:001> c = Company.new
 => #<Company id: nil, name: nil> 
:002> c.employees
 => [] …
Run Code Online (Sandbox Code Playgroud)

ruby activerecord ruby-on-rails ruby-on-rails-3

9
推荐指数
1
解决办法
7166
查看次数

如何使用 importmap 和 Sprockets 在 Rails 7 中通过 JS 中的 URL 引用资源?

在应用程序中,我需要从 JS 文件实例化音频文件(我正在使用 AudioContext API),或多或少如下所示:

playAudio(url) {
  this.audioContext = new (window.AudioContext || window.webkitAudioContext)();
  let data = await fetch(url).then(response => response.arrayBuffer());
  let buffer = await this.audioContext.decodeAudioData(data)
  const source = this.audioContext.createBufferSource()
  source.buffer = buffer
  source.connect(this.audioContext.destination)
  source.start()
}
Run Code Online (Sandbox Code Playgroud)

此 JS 文件是在使用 importmap 和 Sprockets 的新 Rails 7 应用程序中加载的 Stimulus 控制器。

在开发环境中,JS 可以猜测路径,因为 Sprockets 将以规范名称(例如/assets/audio/file.wav)来服务资产。然而,在生产中,在资源预编译期间,Sprockets 在文件名后添加一个哈希值,并且只能使用/assets/audio/file-f11ef113f11ef113f113.wav.

该文件名无法进行硬编码,因为它取决于预编译(从技术上讲,我可能可以使用哈希对路径进行硬编码,因为文件不会经常更改,但我不想对此哈希进行任何假设)。

除公共文件夹中的其他资产外,Sprockets 在预编译期间生成的清单中引用了该文件。使用Rails.application.assets_manifest.files我可以访问清单数据并安全地进行映射。

这是我为此编写的助手:

  def audio_assets_json
    audio_assets = Rails.application.assets_manifest.files.select do |_key, file|
      file['logical_path'].start_with?('audio/')
    end

    JSON.pretty_generate(
      audio_assets.to_h { |_k, f| [f['logical_path'], asset_url(f['logical_path'])] } …
Run Code Online (Sandbox Code Playgroud)

javascript ruby ruby-on-rails rails-sprockets import-maps

8
推荐指数
0
解决办法
992
查看次数

如何使用CPACK_RPM_POST_INSTALL_SCRIPT_FILE?

这是我尝试使用CMake 2.8.2重现问题的设置:

/test.sh:

/CMakeLists.txt:

cmake_minimum_required(VERSION 2.8)

SET(CPACK_PACKAGE_NAME test)
SET(CPACK_PACKAGE_VERSION 1.0)

LIST(APPEND CPACK_GENERATOR RPM)

SET(CPACK_RPM_POST_INSTALL_SCRIPT_FILE "test.sh")

INCLUDE(CPack)
Run Code Online (Sandbox Code Playgroud)

然后:

mkdir build && cd build && cmake .. && make package
Run Code Online (Sandbox Code Playgroud)

结果:

CPackRPM:警告:CPACK_RPM_POST_INSTALL_SCRIPT_FILE不存在 - 忽略

如何让构建系统知道我的文件test.sh?

rpm cmake

2
推荐指数
1
解决办法
1865
查看次数