标签: rails-models

has_one和has_many在同一个模型中.rails如何跟踪它们?

我有点困惑,即使它正常工作如何工作.我有一个与同一个其他模型有两个关联的模型.

公司拥有一个所有者和公司拥有许多类用户的员工.

这是我的公司型号:

class Company < ActiveRecord::Base
  validates_presence_of :name

  has_many :employee, :class_name => 'User'
  has_one :owner, :class_name => 'User'
  accepts_nested_attributes_for :owner, :allow_destroy => true
end
Run Code Online (Sandbox Code Playgroud)

这是我的用户模型:

class User < ActiveRecord::Base
  include Clearance::User
  attr_accessible :lastname, :firstname #other attr are whitelisted in clearance gem
  validates_presence_of :lastname, :firstname
  belongs_to :company
end
Run Code Online (Sandbox Code Playgroud)

现在假设我有这家公司的3名员工,包括业主.当我第一次创建公司时,我将所有者设置为id为1的员工,另外两个(2,3)通过设置company_id(user.company = company)添加到员工列表中.所有这三个都将他们的company_id设置为公司ID,我们可以假设为1

当我要求company.owner时,我得到了正确的用户,当我做公司工作时,我得到了全部三个.

如果我将所有者更改为用户2,则会通过将用户1的company_id设置为nil来自动从员工中删除用户1.这很好,如果我把他作为一个简单的员工加回来,一切都还是不错的.

铁路怎么知道哪个是哪个?我的意思是,它是如何知道员工是所有者而不仅仅是员工?架构中没有任何内容定义此内容.

我有一种感觉,我应该扭转所有者协会,让公司属于一个用户.

activerecord ruby-on-rails rails-models

9
推荐指数
2
解决办法
7494
查看次数

在Ruby on Rails中,如果我们生成了一个模型"Animal",现在想拥有"Dog",我们应该怎么做呢?

比如说,如果我们生成了一个模型

rails generate model animal name:string birthday:date
Run Code Online (Sandbox Code Playgroud)

现在我们想要创建其他模型来继承它(比如Dog和Cat),我们应该rails generate model再次使用还是自己添加文件?如果我们使用,我们如何指定Dog应该继承Animal rails generate model

我想如果我们使用rails generate model而不是自己添加模型文件,那么也会为我们创建单元测试文件和fixture文件.还添加了迁移文件,除非它使用MongoDB,否则将不会有迁移文件.

inheritance ruby-on-rails single-table-inheritance rails-models

7
推荐指数
2
解决办法
5672
查看次数

Rails应用程序中的命名空间模型

我最近和我的一个朋友讨论过,他也是一名RoR开发人员.我们争论如何管理Rails模型.我个人喜欢在默认命名空间中只留下根模型(例如User,Article,Bill等),并且依赖模型转到一个模块(例如User :: Profile,User :: Activity),其名称为root他们与之相关的模型.

另一方面,我看到许多项目在默认命名空间中有100个模型,如user_profile,user_activity等.从Java(Spring)开发来看,java社区倾向于在包中组织类并将它们逻辑分组,我觉得这很有吸引力.

所以问题是:在模块中对模型进行分组是否存在任何缺陷(除了额外的:关系定义中的class_name),是否存在人们通常不这样做的具体原因?

ruby-on-rails rails-models

7
推荐指数
1
解决办法
517
查看次数

Rails多个belongs_to为同一个类

假设我有一个A型模型和一个B型模型,它的字段为a_id a2_id.我希望有类似的东西:

class B
  belongs_to :a
  belongs_to :a (using a2)
end
Run Code Online (Sandbox Code Playgroud)

有谁知道我会怎么做?我试图使用B类链接我的数据库中的类似对象.

ruby ruby-on-rails rails-models ruby-on-rails-3

6
推荐指数
1
解决办法
965
查看次数

如何在命名范围内拥有多个条件?

我有一个用户模型.我可以检查用户是否是管理员a_user.try(:admin?).

我想定义一个命名范围,让所有用户在最近X分钟内更新,而不是管理员.到目前为止,我有:

scope :recent, lambda { { :conditions => ['updated_at > ?', 5.minutes.ago] } }
Run Code Online (Sandbox Code Playgroud)

这成功地使所有用户在最近5分钟内更新,但如何合并管理员检查?我不知道如何try()在范围内调用用户的实例...

scope named-scope model ruby-on-rails rails-models

6
推荐指数
3
解决办法
1万
查看次数

测试迁移未与我的 Rails 引擎一起运行,即使指定了 `maintain_test_schema!`

我正在开发一个 Rails 引擎(插件)。到目前为止我有

  • 将 RSpec 设置为框架
  • 添加了一个迁移以创建一个名为的模型/表 MyJob
  • 在下面添加了一些基本模型测试 spec/models/my_job_spec.rb

rails 模板会自动创建一个spec/dummy应用程序,因此我执行以下操作来运行我的测试

# Create the development and test DBs
rake db:create

# Copy migrations over to my dummy app
cd spec/dummy
rake my_app:install:migrations
cd ../..

# Run specs
rspec spec/models/my_job_spec.rb
Run Code Online (Sandbox Code Playgroud)

但是,当我运行规范时,出现错误:

> rspec spec/models/
/Users/jeeves/.rvm/gems/ruby-2.2.2@gb/gems/activerecord-5.1.0/lib/active_record/migration.rb:576:in `check_pending!':  (ActiveRecord::PendingMigrationError)

Migrations are pending. To resolve this issue, run:

        bin/rails db:migrate RAILS_ENV=test
Run Code Online (Sandbox Code Playgroud)

我认为这会自动发生,因为rails_helper.rb我肯定有以下内容,这应该为我维护我的测试模式

ActiveRecord::Migration.maintain_test_schema!
Run Code Online (Sandbox Code Playgroud)

它与插件或引擎的工作方式不同吗?

编辑:我尝试了运行bin/rails db:migrate RAILS_ENV=test, insidespec/dummy/然后重新运行的建议rspec spec/。仍然没有运气。

rspec ruby-on-rails rails-models rails-migrations rails-engines

6
推荐指数
1
解决办法
1811
查看次数

锁定导轨上的行更新以避免冲突.(Postgres后端)

所以我的模型对象上有一个方法,当行中的二进制字段从null更新为true时,它创建一个唯一的序列号.它实现如下:

class AnswerHeader < ApplicationRecord
  before_save :update_survey_complete_sequence, if: :survey_complete_changed?

  def update_survey_complete_sequence
    maxval =AnswerHeader.maximum('survey_complete_sequence')
    self.survey_complete_sequence=maxval+1
  end
end
Run Code Online (Sandbox Code Playgroud)

我的问题是我需要锁定什么,以便同时更新两行不会导致两行具有相同的survey_complete_sequence?

如果可以锁定单个行而不是整个表,那将是一个好的,因为这是用户经常访问的表.

ruby-on-rails rails-models rails-activerecord

6
推荐指数
1
解决办法
696
查看次数

可选时Railsbelongs_to不验证id

我正在运行 Rails 5.1.4,我有一个看起来像这样的模型:

class Quota < ActiveRecord::Base
  belongs_to :domain, optional: true
  belongs_to :project, optional: true
end
Run Code Online (Sandbox Code Playgroud)

配额应属于域或项目,但不能同时属于两者(因此设置optional: true)。

但是,如果提供了无效的项目或域 ID,我似乎无法弄清楚如何使 rails 抛出错误。

这是发生的事情:

q = Quota.create!(domain_id: nil, project_id: 'invalid_id')
q.project_id # -> nil
Run Code Online (Sandbox Code Playgroud)

即使我明确传递了 project_id,如果它与有效项目不匹配,它也会神奇地将其清除。我尝试添加自定义验证方法,但是在调用验证方法时,它已经设置为 nil。它甚至不使用该project_id=方法;我检查了。

如果 ID 无效而不是将其设置为 nil,有没有办法让 Rails 引发错误?(同时仍然允许一个 nil 值)

activerecord ruby-on-rails rails-models ruby-on-rails-5

6
推荐指数
1
解决办法
3701
查看次数

Rspec测试中nil类的未定义方法

因此,我有一Game堂课,可以有很多Versions,每个课Version可以有很多GameStats。我有我的每个Version belongs_toa Game,每个GameStat belongs_toa Versionhas_one Game通过Versions。在我的测试中,当我测试对gameversion对象的响应以及对象相等性时,这些测试通过了,但是当我尝试通过调用引用对象时@stats.game,得到了#<NoMethodError: undefined method 'game' for nil:NilClass>。我在这里很困惑,因为我可以@stats.game在rails控制台中进行操作,但是在某种程度上它在测试中不存在。

相关的模型代码在这里:

class Game < ActiveRecord::Base
  has_many :versions, dependent: :destroy
  has_many :platforms, through: :versions
  has_many :game_stats, class_name: 'GameStats', through: :versions

  validates :name, presence: true
end

class GameStats < ActiveRecord::Base
  belongs_to :version

  has_one :game, through: :version

  validates :version_id, presence: true
end

class Version …
Run Code Online (Sandbox Code Playgroud)

ruby-on-rails associations rails-models model-associations ruby-on-rails-4

4
推荐指数
1
解决办法
4360
查看次数

Rails 4 has_many through - 消息发送方和接收方

我正在尝试实现以下关系和对象调用

一个用户可以发送多条消息 (user.sent_messages) 一条消息可以有一个发送者 (message.sender)

一个用户可以接收很多消息(user.received_messages)一个消息可以有很多接收者(message.receivers)

我的架构如下所示:

create_table "activities", force: true do |t|
 t.integer  "sender_id"
 t.integer  "message_id"
 t.datetime "created_at"
 t.datetime "updated_at"
 t.integer  "receiver_id"
end

create_table "messages", force: true do |t|
 t.text     "body"
 t.datetime "created_at"
 t.datetime "updated_at"
 t.boolean  "read",       default: false
end
Run Code Online (Sandbox Code Playgroud)

我的模型看起来像这样:

class User < ActiveRecord::Base
 has_many :activities, class_name: 'Activity', foreign_key: 'sender_id', dependent: :destroy
 has_many :sent_messages, through: :activities

 has_many :reverse_activities, class_name: 'Activity', foreign_key: 'receiver_id'
 has_many :received_messages, through: :reverse_activities
end

class Activity < ActiveRecord::Base
belongs_to :sent_messages, class_name: 'User'
belongs_to :received_messages, class_name: …
Run Code Online (Sandbox Code Playgroud)

ruby-on-rails rails-models ruby-on-rails-4 rails-activerecord

4
推荐指数
1
解决办法
2024
查看次数