为什么在多态关联中没有外键,例如下面表示为Rails模型的外键?
class Comment < ActiveRecord::Base
belongs_to :commentable, :polymorphic => true
end
class Article < ActiveRecord::Base
has_many :comments, :as => :commentable
end
class Photo < ActiveRecord::Base
has_many :comments, :as => :commentable
#...
end
class Event < ActiveRecord::Base
has_many :comments, :as => :commentable
end
Run Code Online (Sandbox Code Playgroud) database ruby-on-rails foreign-key-relationship polymorphic-associations
如果我定义一个Customer和Order模型,其中Customer"有很多" Orders和Order"属于" Customer,在Rails中我们谈论Order有一个外键到Customer通过customer_id但我们并不是说这是在数据库中强制执行.
由于Rails没有将其定义为数据库级约束,因此存在数据完整性被违反的风险,可能在应用程序之外(或者如果同时收到请求,则在内部?),除非您手动在数据库中强制执行约束.
为什么Rails没有在数据库级别定义外键,或者有没有办法让Rails这样做?
class Customer < ActiveRecord::Base
has_many :orders
end
class Order < ActiveRecord::Base
belongs_to :customer
end
ActiveRecord::Schema.define(:version => 1) do
create_table "customers", :force => true do |t|
t.string "name"
end
create_table "orders", :force => true do |t|
t.string "item_name"
t.integer "customer_id"
end
end
Run Code Online (Sandbox Code Playgroud) Customers
customer_id
Orders
order_id
customer_id fk
Run Code Online (Sandbox Code Playgroud)
如果我有两个表并在Orders表中的customer_id上定义了一个外键,通过允许它为null,我说我可以订购一个没有客户关联的订单.因此,可以为空的外键的概念似乎与外键的目的不一致,即强制执行此约束.
是否有一个简单的例子表明可以使用可以为空的外键?或支持允许他们的论据?
在Rails中困扰我的一件事是脚手架产生我并不总是需要的迁移.
有没有办法在没有相应迁移的情况下生成脚手架?
我看到<p>标签在其他人的代码中使用了很多,但从未在我自己的工作中使用它.
我想知道这对使用<div>标签有什么好处?
将<p>标签合并到我的页面中是否有任何好处?
仅使用<div>标签没有任何缺点<p>吗?
我initialized是一个Mercurial项目Machine A,committed我的更改和uploaded它们到远程存储库.
然后我在cloned那个存储库上Machine B,committed一些额外的更改和uploaded它们到同一个远程存储库.
在这两种情况下,我都使用相同的命令上传了更改:
hg push https://username:password@domain/user/repository/
Run Code Online (Sandbox Code Playgroud)
现在我回到了机器A,我pull从远程存储库开始,merg使用**KDiff3 GUI工具使用命令****两个变更集之间的任何变化:
hg pull
hg merge
hg commit
Run Code Online (Sandbox Code Playgroud)
但是,当我尝试在此拉取和合并之后将最新的更改从机器A推回到远程存储库时,我收到以下消息:
hg push https://username:password@domain/user/repository/
pushing to https://username:password@domain/user/repository/
searching for changes
abort: push creates new remote heads!
(did you forget to merge? use push -f to force)
Run Code Online (Sandbox Code Playgroud)
为什么会说"你忘了合并"? - 我完成了合并.
强迫推动并创造"新的遥控头"是不是很糟糕?
如果是这样,我该如何避免这种情况?
更新:
我hg merge再次跑了" "并得到了这个输出:
5 files updated, 1 …Run Code Online (Sandbox Code Playgroud) 使用局部变量似乎是可取的,可以在应用程序范围内使用,以避免整个应用程序的依赖.
但是在单个控制器中,引用您知道将在使用partial的所有操作中可用的实例变量似乎是可以接受的.
但是,如果执行此操作,则可能存在风险,即特定操作可能会更改为不再向其视图提供实例变量.部分将停止工作.但是,我不确定这是否真的是一个问题,因为常规视图会遇到相同的风险.
如果在部分中引用实例变量,这有关系吗?
如果Parent has_many :children,必须 Child :belongs_to :parent吗?
Rails控制台似乎不喜欢由分号分隔的同一行上的多个ruby语句.每当我这样做,下一行开头,?>我发现只执行了第一个语句.你是否必须将每个声明放在一个单独的行上?
>> user = User.new
user = User.new
=> #<User id: nil, username: "", hashed_password: "", first_name: "", last_name: "", email: "", display_name: "", user_level: 0, created_at: nil, updated_at: nil, posts_count: 0>
>> user.username = "John"; hashed_password = "John"; first_name = "John"; last_name = "coltrane"; email = "John@coltrane.com"; display_name = "Johndispay"; user_level = 9;
user.username = "John"; hashed_password = "John"; first_name = "John"; last_name = "coltrane"; email = "John@coltrane.com"; display_name = "Johndispay"; user_level = 9;
?> user.save …Run Code Online (Sandbox Code Playgroud) 我正在尝试为我的应用程序的用户实现一个简单的收件箱系统,以便可以相互发送基本消息 - 就像在许多论坛系统中一样.
如果User has_many :messages,自上次阅读以来,如何跟踪并通知用户未读的消息?
我认为点击Messages屏幕链接需要记录在一个单独的表格中(MessagesClicks).
这是最好的方法吗?
那么我检查MessagesClicks表格,看看自上次点击链接以来是否有任何新消息 - 基于一个last_clicked或多个updated_at字段.
database ×3
associations ×1
console ×1
foreign-keys ×1
html ×1
mercurial ×1
merge ×1
messages ×1
migration ×1
paragraph ×1
partial ×1
push ×1
repository ×1