我的rails应用程序有问题.从Rails 3到4更新后.当我在开发模式下启动服务器后浏览页面时,一切都很好.
但是在单个代码更改(甚至添加空格)之后,每个页面请求都会显示以下错误.
无法自动加载常量用户,预期/path/to/my/rails-app/app/models/user.rb来定义它
该文件完全存在于那里并定义了类:
class User < ActiveRecord::Base
…
Run Code Online (Sandbox Code Playgroud)
我尝试了很多事情config.autoload_paths,并 config.eager_load_paths在application.rb,但没有运气.停用弹簧也没有帮助.
开发应用程序并在每次更改后都必须重新启动服务器才能达到90秒.
$ rails -v
Rails 4.2.4
$ ruby -v
ruby 2.1.7p400 (2015-08-18 revision 51632) [x86_64-linux]
Run Code Online (Sandbox Code Playgroud)
一些相关的配置:
development.rb
MyApp::Application.configure do
# Settings specified here will take precedence over those in config/application.rb
# In the development environment your application's code is reloaded on
# every request. This slows down response time but is perfect for development
# since you don't have to restart …Run Code Online (Sandbox Code Playgroud) 我有这个非常基本的表结构:
dbo.tblCategory
dbo.tblQuestion(与tblCategory的
多对一关系)
dbo.tblAnswer(与tblQuestion的
多对一关系)
基本上,我正在尝试做的是当我加载一个类别时,我想加载所有问题和所有答案.
现在,我已经能够使用以下代码执行此操作:
public tblCategory Retrieve(int id)
{
using (var entities = Context)
{
var dto =
(from t in entities.tblCategory.Include("tblQuestion")
.Include("tblQuestion.tblAnswers")
where t.Id == id
select t).FirstOrDefault();
return entities.DetachObjectGraph(dto);
}
}
}
Run Code Online (Sandbox Code Playgroud)
但是,我并不完全迷恋于此; 如果关系名称在我的模型中发生变化; 构建项目时我不会遇到错误.理想情况下,我想使用lambda表达式; 这样的事情:
public tblCategory Retrieve(int id)
{
using (var entities = Context)
{
var dto =
(from t in entities.tblCategory.Include(t => t.tblQuestion)
where t.Id == id
select t).FirstOrDefault();
return entities.DetachObjectGraph(dto);
}
}
Run Code Online (Sandbox Code Playgroud)
现在,使用上面的代码片段; 我坚持如何深入到Answers表.关于我可以用于这个lambda表达式的任何想法?
我正在使用EF Code First,我有一个名为Category的导航属性,我想在每个调用中加载:
public class Product
{
...
public Category Category { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
要做到这一点,我必须将它包含在我将在Product上进行的所有调用中
var results = from p in db.Products.Include("Category") select p;
Run Code Online (Sandbox Code Playgroud)
有没有办法让Category属性急切加载,因此在每次调用时生成一个SQL连接,而不必每次都包含它?
谢谢
对不起,标题不是更具体 - 我不知道如何简洁地描述.我有Trips和Location,它们具有多对多的关系 - 直截了当,除了Locations不需要知道使用它们的Trips.我创建了这些实体来代表这个:
public class Trip
{
public int TripId { get; set; }
public virtual IList<TripLocation> TripLocations { get; set; }
}
public class TripLocation
{
public int TripId { get; set; }
public int LocationId { get; set; }
public virtual Location Location { get; set; }
}
public class Location
{
public int LocationId { get; set; }
// Note: Intentionally no collection of Trips
}
Run Code Online (Sandbox Code Playgroud)
我可以让Trip快速加载它的TripLocations但我无法让TripLocations急于加载他们的位置.我已经尝试了一些流畅的配置组合和"包含"在查询中,如
IQueryable<Trip> query = from trip in context
.Include(r …Run Code Online (Sandbox Code Playgroud) 我的代码中有一个特定的查询,需要急切加载所有相关的实体(两个 - > 1个FK和 - > N个FK),因为上下文将在此之后处理.
我做了一个通用的"查询"方法,params Expression<Func<MyItem, object>>[] includes然后内部链接它们.那部分工作正常.
查询如下所示:
var item = facade.Query<MyItem>(
c => c.Childs.Select(x => x.Parent),
c => c.Childs.Select(x => x.SubChild1),
c => c.Childs.Select(x => x.SubChildNotWorking),
c => c.Childs.Select(x => x.SubChild2),
c => c.Childs.Select(x => x.SubChild3),
c => c.Childs.Select(x => x.SubChildrens)
).FirstOrDefault(c => c.Name == name);
Run Code Online (Sandbox Code Playgroud)
不工作属性的映射(放置在SubChildNotWorking的配置中):
this.HasMany(scnw => scnw.Childs).WithOptional(c => c.SubChildNotWorking).HasForeignKey(c => c.MyForeignKey);
Run Code Online (Sandbox Code Playgroud)
在所有包含中,只有SubChildNotWorking实际上不起作用.在使用调试器检查返回的对象时,我会在所有属性上看到代理.打开代理为我提供了所有其他关系的正确数据,并为该SubChildNotWorking属性提供了"objectcontext已被处置异常" .
我能够发现的唯一区别是,它SubChildNotWorking是一个可以为空的FK(DB上有可空列和dbcontext中的WithOptional配置),而所有其他都是使用WithRequired配置的不可空FK.
数据库也是一个没有使用Code First创建的遗留数据库而不遵循其约定,我只是在DbContext中进行了映射.其他一切都很好.
我试图找出是否急于加载对可空的FK不起作用,但我找不到任何关于它的文档.
这是一个错误,还是预期的行为?但最重要的是,我该如何解决这个问题呢?
谢谢.
我正在构建一个包含以下流的公共活动流:
我正在使用public_activity gem来实现这一目标.
我的问题是是否有办法使用includes多态函数.
我目前运行的代码如下:
#app/models/post.rb
class Post < ActiveRecord::Base
include PublicActivity::Common
attr_accessible :content, :visibility
validates_presence_of :content
belongs_to :postable, :polymorphic => true
has_many :stars
end
#app/models/star.rb
class Star < ActiveRecord::Base
include PublicActivity::Common
validate :duplicate_star
belongs_to :user
belongs_to :post
private
def duplicate_star
errors.add(:base, "Post already starred") if Star.exists?(:user_id => self.user, :post_id => self.post)
end
end
#app/controllers/users_controller.rb
class UsersController < ApplicationController
def index
@post = Post.new
@activities = PublicActivity::Activity.order("id desc").all.includes(:trackable, :owner)
end
end
Run Code Online (Sandbox Code Playgroud)
可跟踪的可以是帖子或明星.我有渲染功能来显示两者.问题是,如果我尝试输出类似{user} starred {postcontent}的内容,它会这样做:
activity.trackable.post.content …Run Code Online (Sandbox Code Playgroud) 假设我们有原始生成的查询:
SELECT company.x AS company_x, ...
FROM company
LEFT OUTER JOIN acc ON acc.id = company.acc
LEFT OUTER JOIN usercomp_links ON company.id = usercomp_links.pid
LEFT OUTER JOIN usergro_links ON acc.id = usergro_links.pid
WHERE usergro_links.eid = %s OR usercomp_links.eid = %s
Run Code Online (Sandbox Code Playgroud)
如果我们加上.options(subqueryload(Company.childs))这个,我们将得到:
SELECT company.x AS company_x, ..., anon_1.company_id AS anon_1_company_id
FROM (
SELECT company.id AS company_id
FROM company
LEFT OUTER JOIN acc ON acc.id = company.acc
LEFT OUTER JOIN usercomp_links ON company.id = usercomp_links.pid
LEFT OUTER JOIN usergro_links ON …Run Code Online (Sandbox Code Playgroud) 我有Banks桌子和单独的桌子services
$bank = Banks::find(1);
echo $bank->service(1); // print bank with that service (serviceId 1)
Run Code Online (Sandbox Code Playgroud)
可以用service_id = 1来急切加载所有银行.有点像
Bank::with('service(1)')->get();
Run Code Online (Sandbox Code Playgroud)
先感谢您
我有以下型号:
class User < ActiveRecord::Base
def send_message(content)
MessagePoro.new(content).deliver!
end
def self.send_to_all(content)
threads = []
all.each do |user|
threads << Thread.new do
user.send_message(content)
end
end
threads.each(&:join)
end
end
Run Code Online (Sandbox Code Playgroud)
MessagePoro模型可以很简单,例如app/models/message_poro.rb:
class MessagePoro
def initialize(content)
# ...
end
def deliver!
# ...
end
end
Run Code Online (Sandbox Code Playgroud)
现在,当我有100个用户,并且我正在运行User.send_to_all("test")时,我有时会遇到更严重的错误:
RuntimeError: Circular dependency detected while autoloading constant MessagePoro
Run Code Online (Sandbox Code Playgroud)
要么:
wrong number of arguments (1 for 0)
Run Code Online (Sandbox Code Playgroud)
我认为它必须是因为没有加载MessagePoro并且所有线程都试图同时加载它,或类似的东西.由于这些错误有时只会发生,我很确定只有当存在"竞争条件"或者有线程时才会出现这种情况.我已经尝试在启动Threads之前初始化MessagePoro,并且我已经使用了eager_loading,但问题似乎仍然存在.还有什么可以尝试缓解这个问题?
在Grails/GORM中,static mapping = {xyz lazy: false}&之间有什么区别static fetchMode = [xyz: 'eager']?
例:
class Book {
static belongsTo = [author: Author]
static mapping = {author lazy: false}
static fetchMode = [author: 'eager']
}
Run Code Online (Sandbox Code Playgroud) eager-loading ×10
c# ×3
lazy-loading ×2
orm ×2
.net-3.5 ×1
activerecord ×1
code-first ×1
fetch ×1
grails ×1
grails-orm ×1
include ×1
laravel ×1
php ×1
python ×1
sql ×1
sqlalchemy ×1