标签: rails-models

Rails has_one:通过关联

Rails有一个has_one :through关联,通过第二个模型帮助建立与第三个模型的一对一关联.除了建立一个快捷方式关联之外,它的实际用途是什么,否则这将是一个额外的步骤.

以Rails 指南为例:

class Supplier < ActiveRecord::Base
  has_one :account
  has_one :account_history, :through => :account
end

class Account < ActiveRecord::Base
  belongs_to :supplier
  has_one :account_history
end

class AccountHistory < ActiveRecord::Base
  belongs_to :account
end
Run Code Online (Sandbox Code Playgroud)

可能允许我们做类似的事情:

supplier.account_history
Run Code Online (Sandbox Code Playgroud)

否则将达到:

supplier.account.history
Run Code Online (Sandbox Code Playgroud)

如果它只是为了更简单的访问,那么从技术上讲,可能存在一对一的关联,它将模型与通过n-1模型的某个第n个模型连接起来,以便于访问.除了快捷方式之外,还有什么我想念的吗?

ruby-on-rails associations rails-models rails-activerecord

67
推荐指数
3
解决办法
5万
查看次数

两个Rails应用程序之间的共享模型 - Workflow的理想解决方案是什么?

我目前正在开发一个Rails 3项目,该项目分为四个部分:

  • 面向公众的网站
  • 管理网站/后端
  • 模特
  • 用于第三方数据访问的API

由于模型在三个关键组件之间共享,我希望它们远离一个主项目,但是每个部分都需要访问模型,但我不想重复代码并且在任何地方都有不同的版本.

目前我在gem中有模型代码,在每个项目的Gemfile中我使用以下行引用它们:

gem "my_models", :path => "../my_models/"
Run Code Online (Sandbox Code Playgroud)

但是,当我部署到我们的测试服务器以供我的同事评估系统时,我需要从外部存储库中提取模型,因此我将以上行替换为以下内容:

gem "my_models", :git => "git@private.repository.com:username/my_models.git"
Run Code Online (Sandbox Code Playgroud)

这在它自身运行良好,但它在"版本"方面非常笨重(即我每次希望将更改部署到测试服务器时都需要碰撞版本),切换线路以使用git而不是本地,并确保我正确地推送文件.

以前我使用的是共享的git子模块,但这很尴尬.

我宁愿不把所有内容都构建成一个大型项目,因为这些项目往往变得怪异且难以维护,如果可能的话我也想分开关注点,因此我对管理站点所做的任何更改都没有太多有可能影响其他组件 - 显然这些模型有可能引发问题,但这是我已经考虑和理解的风险.

当涉及到这样的事情时,那里的人们会提出什么建议呢?或者,我是否完全采用了错误的方式?

一些额外的背景:

这个应用程序是对现有网站的重写,遵循"将所有内容整合到一个项目中"的模式 - 不幸的是,这里有两个问题:

  1. 该应用程序开发得很糟糕 - 我继承了这个项目,当我第一次拿起它时,每个页面的加载时间约为2分钟,只有一个用户 - 这已经减少但仍然存在问题
  2. 我们目前处于当前站点的容量限制,我们预计在未来6个月内我们将需要承担更多负载 - 然而使用"一体化"应用程序进行扩展意味着我们将在扩展时浪费资源网站的后端不需要它.

基本上我要分开两件事 - 前端(公共网站和API)和后端 - 我对软件开发的所有了解都告诉我,将所有这些结合在一起并不是一个理想的解决方案(过去的历史表明我认为,在确保前端性能方面,将这两者分开是一个很好的举措.

也许我需要从另一个角度来看这个 - 保持每个项目中的模型,而不是在项目之间共享它们,每个功能区域都有一个简化的功能子集(即后端需要知道谁创建了一个帖子,但是前端并不真正关心它,因此在阅读模型时省略了这种逻辑).

ruby-on-rails backend rails-models

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

在Rails 3中删除表并删除模型的最佳方法是什么?

我有一个模型和一个桌子,我不再需要在我的应用程序中,我可以将它们留在那里,但我想删除它们以保持整洁.

我正在试图找出删除它们的最佳方法,而不是弄乱我的迁移db/schema.rb文件以及它可能对我的生产环境产生的任何副作用,我的应用程序在Heroku上.我在我的本地机器和heroku上使用PostgreSQL.

到目前为止,我已经找到了两种方法,但我不确定哪种方法最好?

方法1

我想过要进入我的数据库并丢弃表然后销毁模型.

rails db
DROP TABLE table_name
\q
rails destroy model model_name
Run Code Online (Sandbox Code Playgroud)

如果我这样做,我对此模型/表的迁移会发生什么?我有两个此模型的迁移,一个timestamp_create_modelname和一个add_attribute_to_table名称.

此方法也会更新db/schema.rb文件吗?

当我将应用程序推送到Heroku时,我怀疑模型将被删除但是表格将保留在原位,是否有一个heroku命令来删除表格.

方法二

我读到的另一种方法是生成一个新的迁移以删除表然后销毁模型.

rails generate migration drop_tablename
Run Code Online (Sandbox Code Playgroud)

然后更新以下文件:

db/migrate/timestamp_drop_tablename (根据Dan Wich的回答更新)

class DropTablename < ActiveRecord::Migration
  def up
    drop_table :tablename
  end

  def down
    create_table :tablename do |t|
      t.string :table_column
      t.references :anothertable

      t.timestamps        
    end
    add_index :tablenames, :anothertable_id
  end
end
Run Code Online (Sandbox Code Playgroud)

然后在终端:

rake db:migrate
rails destroy model model_name
rake db:migrate
git add .
git commit -m "removed table/model_name"
git …
Run Code Online (Sandbox Code Playgroud)

heroku rails-models rails-migrations ruby-on-rails-3

53
推荐指数
2
解决办法
3万
查看次数

LoadError无法自动加载常量消息

在我的应用程序; 当我提交表单时,我收到此错误:

LoadError at /questions
Unable to autoload constant Message, expected /app/models/message.rb to define it
Run Code Online (Sandbox Code Playgroud)

它指向控制器中的create动作Questions:

@message = current_user.messages.new(:subject => "You have a question from #{@question.sender_id}"`
Run Code Online (Sandbox Code Playgroud)

消息模型:

class Mailboxer::Message < ActiveRecord::Base
  attr_accessible :notification_id, :receiver_id, :conversation_id
end
Run Code Online (Sandbox Code Playgroud)

ruby-on-rails rails-models activemodel mailboxer

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

在Rails中,我应该如何为任务应用程序实现状态字段 - 整数还是枚举?

对于Rails 3.0 Todo应用程序,我有一个带有Status字段的Tasks模型.存储状态字段数据(字段类型)的最佳方法是什么,并且仍然在视图(HTML表格)中显示人类可读的版本?状态可以是:

0 =正常
1 =有效
2 =已完成

现在我有这个:

Rails架构在这里:

create_table"tasks",:force => true do | t |
t.integer"status",:limit => 1 ,: default => 0,:null => false

Rails模型在这里:

class Task < ActiveRecord::Base
  validates_inclusion_of :status, :in => 0..2,
    :message => "{{value}} must be 0, 1, or 2"
Run Code Online (Sandbox Code Playgroud)

Rails在这里查看:

<h1>Listing tasks</h1>

<table>
  <tr>
    <th>Status</th>
    <th>Name</th>
    <th></th>
    <th></th>
    <th></th>
  </tr>

<% @tasks.each do |task| %>
  <tr>
    <td><%= task.status %></td>
    <td><%= task.name %></td>
    <td><%= link_to 'Show', task %></td>
    <td><%= link_to 'Edit', edit_task_path(task) …
Run Code Online (Sandbox Code Playgroud)

html enums ruby-on-rails rails-models

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

如何将序列添加到迁移并在模型中使用它们?

我想要一个Customer带有普通主键的模型和另一个用于存储自定义"客户编号"的列.另外,我希望db能够处理默认的客户编号.我认为,定义序列是最好的方法.我使用PostgreSQL.看看我的迁移:

class CreateAccountsCustomers < ActiveRecord::Migration
  def up

    say "Creating sequenze for customer number starting at 1002"
    execute 'CREATE SEQUENCE customer_no_seq START 1002;'

    create_table :accounts_customers do |t|
      t.string :type
      t.integer :customer_no, :unique => true
      t.integer :salutation, :limit => 1
      t.string :cp_name_1
      t.string :cp_name_2
      t.string :cp_name_3
      t.string :cp_name_4
      t.string :name_first, :limit => 55
      t.string :name_last, :limit => 55
      t.timestamps
    end

    say "Adding NEXTVAL('customer_no_seq') to column cust_id"
    execute "ALTER TABLE accounts_customers ALTER COLUMN customer_no SET DEFAULT NEXTVAL('customer_no_seq');"

  end

  def down
    drop_table …
Run Code Online (Sandbox Code Playgroud)

ruby-on-rails rails-models rails-migrations rails-postgresql ruby-on-rails-3.1

18
推荐指数
1
解决办法
6646
查看次数

Rails:无效的单表继承类型错误

所以,我正在使用现有的数据库迁移这个php站点,我无法将其转换为Rails.有一个表:Quotes有一个名为的列type.每当我尝试创建一个模型并设置类型时,它会告诉我以下错误:

ActiveRecord::SubclassNotFound (Invalid single-table inheritance type: HOME is not a subclass of Quotes)

我不明白为什么它认为它继承,因为它不应该.我的create方法如下所示:

quote = Quotes.create(
  agent_id: agent.id,
  client_id: client.id,
  type: 'HOME',
  status: 0,
  date_created: DateTime.now 
)
Run Code Online (Sandbox Code Playgroud)

如果我注释掉类型,一切正常.但是键入它错误.

rails-models ruby-on-rails-4

16
推荐指数
1
解决办法
6744
查看次数

belongs_to关联rails的嵌套属性

我有两个模型,投诉和公司.投诉belongs_to以及accepts_nested_attributes公司和公司has_many投诉.

# Models

class Complaint < ActiveRecord::Base
  attr_accessible :complaint, :date, :resolved

  belongs_to :user, :class_name => 'User', :foreign_key => 'id'
  belongs_to :company, :class_name => 'Company', :foreign_key => 'id'
  has_many :replies

  accepts_nested_attributes_for :company

end

class Company < ActiveRecord::Base
  attr_accessible :name

  has_many :complaints, :class_name => 'Complaint', :foreign_key => 'id'
  has_many :branches, :class_name => 'Branch', :foreign_key => 'id'
  belongs_to :industry

end
Run Code Online (Sandbox Code Playgroud)

在投诉控制器中,我尝试在新方法中构建公司.

# Complaint Controller

class ComplaintsController < ApplicationController
...
def new
    @complaint = Complaint.new
    @complaint.build_company

    respond_to do …
Run Code Online (Sandbox Code Playgroud)

forms has-many belongs-to rails-models ruby-on-rails-3.2

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

Ruby on Rails:如何迁移模型上的更改?

在Rails应用程序中,如何迁移我在模型中所做的更改?例如,我知道如果我使用命令"rails g model Person name:string"创建一个模型,也会创建一个迁移.但是,如果在此步骤之后我转到创建的模型"Person"并添加一个新属性,是否会将此新属性自动添加到迁移中以便以后在数据库中持久化?或者我是从错误的一面看这个,并且应该将一个属性添加到迁移中,然后添加到模型中?

问候

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

10
推荐指数
1
解决办法
9853
查看次数

在Rails模型中指定可选引用

我有赞助商模型和促销代码模型.

  • 赞助商可以有零个或多个促销代码
  • 促销代码可以有零个或一个赞助商

因此,促销代码应该具有对赞助商的可选引用,即sponsor_id,可以具有或不具有值的引用.我不知道如何在Rails中设置它.

这是我到目前为止所拥有的:

# app/models/sponsor.rb
class Sponsor < ActiveRecord::Base
  has_many :promo_codes  # Zero or more.
end
Run Code Online (Sandbox Code Playgroud)
# app/models/promo_code.rb
class PromoCode < ActiveRecord::Base
  has_one :sponsor  # Zero or one.
end
Run Code Online (Sandbox Code Playgroud)
# db/migrate/xxxxx_add_sponsor_reference_to_promo_codes.rb
# rails g migration AddSponsorReferenceToPromoCodes sponsor:references
# Running migration adds a sponsor_id field to promo_codes table.
class AddSponsorReferenceToPromoCodes < ActiveRecord::Migration
  def change
    add_reference :promo_codes, :sponsor, index: true
  end
end
Run Code Online (Sandbox Code Playgroud)

这有意义吗?我的印象是,我必须使用下belongs_to我的推广代码模式,但我对这个没有依据,只是我还没有看到has_manyhas_one例子呢.

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

10
推荐指数
2
解决办法
6158
查看次数