我听说Kevin Skoglund(lynda.com)说,养成在开发过程中频繁重启Webrick的习惯是一种好习惯.虽然通常您不需要重新启动Webrick来查看您的更改,但他暗示有时可能需要这样做?有谁知道这些情况可能是什么?这让奇怪Webrick是否有点脆弱.
rake db:schema:dump
Run Code Online (Sandbox Code Playgroud)
此命令为您提供遗留数据库的模式,您可以从生成的模式中为该数据库构建迁移.
但是如果该数据库中包含数据,那么如果有一个rake命令来检索Rails生成的迁移文件中的数据,那就太好了.
也许我在做梦 - 可能要求Rails可以查看遗留数据库中的数据,并从现有数据中为您构建迁移,这可能要求太多 - 如下所示:
class LoadDefaultData < ActiveRecord::Migration
def self.up
bopeep = User.find_by_username 'bopeep'
BlogPost.create(:title => 'test', :content => 'test', :author_id => bopeep.id, :status => 'ok')
end
def self.down
end
end
Run Code Online (Sandbox Code Playgroud)
或者有办法吗?
我添加了一个计数器缓存但无法让它更新.但我可以通过添加新的博客帖子来更新父级 - 博客文章模型 - 我可以通过添加新评论来更新孩子 - 评论模型.计数器缓存应该通过自动更新blog_posts.comments_count字段来跟踪每篇博文的评论总数.我将概述我经历的一些步骤,希望有人会注意到我做错了什么.架构转储结束.
我有一个Blog Post模型:
class Post < ActiveRecord::Base
set_table_name("blog_posts")
belongs_to :author, :class_name => "User", :foreign_key => 'author_id'
has_many :comments, :class_name => "Comment",
:foreign_key => 'post_id', :order => "created_at desc", :dependent => :destroy
has_many :categorizations
has_many :categories, :through => :categorizations
named_scope :recent, :order => "created_at desc", :limit => 5
end
Run Code Online (Sandbox Code Playgroud)
以及将counter_cache设置为post模型的Comments模型:
class Comment < ActiveRecord::Base
belongs_to :post, :class_name => "Post", :foreign_key => "post_id", :counter_cache => true
belongs_to :author, :class_name => "User", :foreign_key => "author_id"
end
Run Code Online (Sandbox Code Playgroud)
我创建了一个迁移,将counter_cache列添加到blog_posts表中: …
(警告:Clueless Rails Newbie!)
在我的专辑视图的show.html.erb中,我在相册控制器中调用了一个公共方法:
<% albums_feature = find_albums_with_feature(feature.id) %>
Run Code Online (Sandbox Code Playgroud)
它会生成NoMethodError.
所以我将方法复制到我的Album模型中并尝试从视图中调用它:
<% albums_feature = Album.find_albums_with_feature(feature.id) %>
Run Code Online (Sandbox Code Playgroud)
但这也会得到一个NoMethodError.
我应该在哪里定义这种方法?
对于它的价值,该方法如下所示:
def find_albums_with_feature(feature_id)
albums_for_feature = Albums.find_by_sql(
["select al.* from albums al, albums_features alfe
where al.id = alfe.album_id
and alfe.feature_id = ?", feature_id])
end
Run Code Online (Sandbox Code Playgroud) w = Widget.new # Create a Widget
w.send :utility_method # Invoke private method!
w.instance_eval { utility_method } # Another way to invoke it
w.instance_eval { @x } # Read instance variable of w
Run Code Online (Sandbox Code Playgroud)
查看上面与Widget类(下面)相关的示例,send和instance_eval方法违反了私有和受保护可见性提供的所有保护.如果是这样,为什么要在Ruby中使用私有和受保护的访问权限,因为无法保证您的定义能够得到尊重?
class Widget
def x # Accessor method for @x
@x
end
protected :x # Make it protected
def utility_method # Define a method
nil
end
private :utility_method # And make it private
end
Run Code Online (Sandbox Code Playgroud) 假设您的同事monkeypat修复Fixnum类并重新定义+方法以减去而不是添加:
class Fixnum
def +(x)
self - x
end
end
>> 5 + 3
=> 2
Run Code Online (Sandbox Code Playgroud)
您的问题是您想要访问+方法的原始功能.因此,您将此代码放入相同的源文件之前.它在将 monkeypatches 之前将+方法别名为"original_plus" .
class Fixnum
alias_method :original_plus, :+
end
class Fixnum
def +(x)
self - x
end
end
Run Code Online (Sandbox Code Playgroud)
现在,您可以通过original_plus访问+方法的原始功能
>> 5 + 3
=> 2
>> 5.original_plus(3)
=> 8
Run Code Online (Sandbox Code Playgroud)
但我需要知道的是:
有没有其他方法加载这个别名BEFORE他的monkeypatch加载除了将其粘贴到他修改的相同源文件中?
我的问题有两个原因:
我创建了一些从Posts表的定义开始的迁移.
class CreatePosts < ActiveRecord::Migration
def self.up
create_table :posts do |t|
t.column "title", :string, :limit => 100, :default => "", :null => false
t.column "content", :text, :null => false
t.column "author", :string, :limit => 100, :default => 0, :null => false
t.column "category", :string, :limit => 20, :default => "", :null => false
t.column "status", :string, :limit => 20, :default => "", :null => false
t.timestamps
end
end
def self.down
drop_table :posts
end
end
Run Code Online (Sandbox Code Playgroud)
另一个用于Users表,在创建表后我为默认用户加载了一些数据.
class CreateUsers < ActiveRecord::Migration
def …
Run Code Online (Sandbox Code Playgroud) 在Java中编译定义类的.java文件时,它会创建一个.class文件.如果您向同事提供这些类文件,则他们无法修改您的来源.您还可以将所有这些类文件捆绑到一个jar文件中,以便更整齐地将其打包并将其作为单个库分发.
当你想与你的同事分享你的功能但你不希望他们能够修改源代码时,Ruby是否有这些功能(除非他们要求你提供实际的.rb源文件并告诉你他们想要更改)?
ruby ×4
migration ×2
activerecord ×1
controller ×1
model ×1
restart ×1
visibility ×1
webrick ×1