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个模型连接起来,以便于访问.除了快捷方式之外,还有什么我想念的吗?
我目前正在开发一个Rails 3项目,该项目分为四个部分:
由于模型在三个关键组件之间共享,我希望它们远离一个主项目,但是每个部分都需要访问模型,但我不想重复代码并且在任何地方都有不同的版本.
目前我在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子模块,但这很尴尬.
我宁愿不把所有内容都构建成一个大型项目,因为这些项目往往变得怪异且难以维护,如果可能的话我也想分开关注点,因此我对管理站点所做的任何更改都没有太多有可能影响其他组件 - 显然这些模型有可能引发问题,但这是我已经考虑和理解的风险.
当涉及到这样的事情时,那里的人们会提出什么建议呢?或者,我是否完全采用了错误的方式?
一些额外的背景:
这个应用程序是对现有网站的重写,遵循"将所有内容整合到一个项目中"的模式 - 不幸的是,这里有两个问题:
基本上我要分开两件事 - 前端(公共网站和API)和后端 - 我对软件开发的所有了解都告诉我,将所有这些结合在一起并不是一个理想的解决方案(过去的历史表明我认为,在确保前端性能方面,将这两者分开是一个很好的举措.
也许我需要从另一个角度来看这个 - 保持每个项目中的模型,而不是在项目之间共享它们,每个功能区域都有一个简化的功能子集(即后端需要知道谁创建了一个帖子,但是前端并不真正关心它,因此在阅读模型时省略了这种逻辑).
我有一个模型和一个桌子,我不再需要在我的应用程序中,我可以将它们留在那里,但我想删除它们以保持整洁.
我正在试图找出删除它们的最佳方法,而不是弄乱我的迁移和db/schema.rb文件以及它可能对我的生产环境产生的任何副作用,我的应用程序在Heroku上.我在我的本地机器和heroku上使用PostgreSQL.
到目前为止,我已经找到了两种方法,但我不确定哪种方法最好?
我想过要进入我的数据库并丢弃表然后销毁模型.
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) 在我的应用程序; 当我提交表单时,我收到此错误:
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) 对于Rails 3.0 Todo应用程序,我有一个带有Status字段的Tasks模型.存储状态字段数据(字段类型)的最佳方法是什么,并且仍然在视图(HTML表格)中显示人类可读的版本?状态可以是:
0 =正常
1 =有效
2 =已完成
现在我有这个:
create_table"tasks",:force => true do | t |
t.integer"status",:limit => 1 ,: default => 0,:null => false
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)
<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) 我想要一个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
所以,我正在使用现有的数据库迁移这个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)
如果我注释掉类型,一切正常.但是键入它错误.
我有两个模型,投诉和公司.投诉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) 在Rails应用程序中,如何迁移我在模型中所做的更改?例如,我知道如果我使用命令"rails g model Person name:string"创建一个模型,也会创建一个迁移.但是,如果在此步骤之后我转到创建的模型"Person"并添加一个新属性,是否会将此新属性自动添加到迁移中以便以后在数据库中持久化?或者我是从错误的一面看这个,并且应该将一个属性添加到迁移中,然后添加到模型中?
问候
ruby ruby-on-rails rails-models rails-migrations ruby-on-rails-3
我有赞助商模型和促销代码模型.
因此,促销代码应该具有对赞助商的可选引用,即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_many有has_one例子呢.
rails-models ×10
activemodel ×1
associations ×1
backend ×1
belongs-to ×1
enums ×1
forms ×1
has-many ×1
heroku ×1
html ×1
mailboxer ×1
ruby ×1