Ruby is already using the class name of my model
Some possibilities:
- avoid the
require 'monitor.rb'
call which is pulling in the standard Monitor instance - do some runtime magic to rename the existing Monitor class.
- monkey with your load path so that
require 'monitor.rb'
pulls in an empty implementation of Monitor.
But in all cases you could end up with the situation where a 3rd party library is using Monitor expecting it to be the standard Monitor class. So, I'd advise against any of the above.
I'd say your only two reasonable options are:
A) you could put your class in a namespace:
Module MyApp
class Monitor
#...
end
end
if your app uses some kind of auto-require magic (e.g it's a rails app) then you would put your implementation in /my_app/monitor.rb. When you wanted to refer to that class you would do something like my_monitor = MyApp::Monitor.new()
, or whatever.
B) you could use a different class name :)
Ruby 2.4 module name conflict with my model class name
Warning
module is used for overriding ruby warn
method. To temporarily get around the error - you can undefine the constant before defining your model:
Object.send(:remove_const, :Warning)
runnable test:
require "bundler/inline"
gemfile(true) do
source "https://rubygems.org"
gem "activerecord", "5.2.3"
gem "sqlite3", "~> 1.3.6"
end
require "active_record"
require "minitest/autorun"
require "logger"
ActiveRecord::Base.establish_connection(adapter: "sqlite3", database: ":memory:")
ActiveRecord::Schema.define do
create_table(:warnings, force: true){|t| t.string :name }
end
RubyWarning = Warning
Object.send(:remove_const, :Warning)
class Warning < ActiveRecord::Base
end
def RubyWarning.warn(str)
puts "still works: #{str}"
end
class SomeTest < Minitest::Test
def test_stuff
wrn = Warning.create name: 'test'
assert_equal(wrn.name, 'test')
warn "Test warn"
end
end
How to define the name of my model class in my case?
You can use the NumberUpdate
model class to better reflect Rails conventions.
class NumberUpdate < ActiveRecord::Base
...
end
and
create_table :number_updates do
...
end
How to fix duplicated model name with using gem
As you said, since they are ActiveRecord classes, they have the same table and they will collide in the namespace of your application.
You can use Modules to avoid the name class collision, or you can update either the gem or your code to use a different name for the class.
If you choose to put your classes within a Module, for the table son the database, you can use set_table_name to use a different name for that class instead of the default one expected by ActiveRecord.
Rails cannot find model with same name as Ruby class
Don't name it Set. That way lies madness.
The deal is that defining the class fails because you're trying to redefine 'Set' which is already defined in the global context.
class Set < ActiveRecord::Base # You are attempting to define a constant 'Set'
# here, but you can't because it already exists
You can put your class in a module, and then you won't get the error because you'll be defining Set within a namespace.
module Custom
class Set < ActiveRecord::Base
end
end
However, every single time you want to use your Set class, you'll have to refer to it as Custom::Set. A lot of Rails magic won't work because it's expecting class names to be defined in the global context. You'll be monkeypatching plugins and gems left and right.
Far easier to just give it a different name.
class CustomSet < ActiveRecord::Base
All the magic works, and no monkeypatching required.
How do I use a model that has the same name as a gem?
You can't. A module and class of the same name cannot exist at the top-level namespace. If you actually did get Rails to load your Stripe
module, your app would crash with a type error, complaining that you've tried to change the type of Stripe
from module to class.
Name is already used or reserved by Ruby on Rails?
You may not create a model with the same name as the Application because it will create conflicting names. When you create an application i.e. rails new Education
it will create a module named Education
as follows
module Education
class Application < Rails::Application
#....
end
end
This named module is then called in files such as config.ru
, routes.rb
and environment.rb
and many more. So if you were able to create a model class by the same name it would create ambiguity as to whether you were calling the Model or the Module.
Rails: How to get the model class name based on the controller class name?
This will do it:
class HouseBuyersController < ApplicationController
def index
@model_name = controller_name.classify
end
end
This is often needed when abstracting controller actions:
class HouseBuyersController < ApplicationController
def index
# Equivalent of @house_buyers = HouseBuyer.find(:all)
objects = controller_name.classify.constantize.find(:all)
instance_variable_set("@#{controller_name}", objects)
end
end
Related Topics
What's the Difference Between the Ruby Irb Prompt Modes
How Does Count Method Works in Ruby
Linking Two Models in a Multi-Model Form
Why Does 'Puts(Nil or 4)' Fail in Ruby
Rails: Pundit::Authorizationnotperformederror
Ruby, How to Access Local Variables Outside the Do - End Loop
Ruby Spreadsheet Row Background Color
Group Users by Age Range in Ruby
Error: "Fatal: I Don't Handle Protocol ''Git' When Using Bundle Install
Nesting Too Deep' Error While Retrieving JSON Using Httparty
How to Set Up the Recipient Id in Public Activity
Native Threads in Ruby 1.9.1, Whats in It for Me
Detect Similar Sounding Words in Ruby
Parsing Large Xml with Nokogiri
How to Upload a JSON File with Secret Keys to Heroku
Using Fork in Windows with Ruby
Https Request Using Net::Http's Block Form -- Is It Possible