据我所知,super关键字调用一个方法,该方法与当前类的超类中的当前方法具有相同的名称.在autoload方法下面,有一个电话super.我想知道在哪个超类中我会找到一个具有相同名称的方法或者super这里要做的调用
module ActiveSupport
module Autoload
...
def autoload(const_name, path = @@at_path)
full = [self.name, @@under_path, const_name.to_s, path].compact.join("::")
location = path || Inflector.underscore(full)
if @@eager_autoload
@@autoloads[const_name] = location
end
super const_name, location
end
....
end
end
module ActiveRecord
extend ActiveSupport::Autoload
...
autoload :TestCase
autoload :TestFixtures, 'active_record/fixtures'
end
Run Code Online (Sandbox Code Playgroud)
此代码来自rails master分支.非常感谢.
我有一套非常简单的HABTM模型
class Tag < ActiveRecord::Base
has_and_belongs_to_many :posts
end
class Post < ActiveRecord::Base
has_and_belongs_to_many :tags
def tags= (tag_list)
self.tags.clear
tag_list.strip.split(' ').each do
self.tags.build(:name => tag)
end
end
end
Run Code Online (Sandbox Code Playgroud)
现在一切正常,除了我在Tags表中得到了大量的重复项.
我需要做些什么来避免标签表中的重复(基于名称)?
我有一个小的ruby脚本,我想使用ActiveRecord轻松访问数据库模型.最好的方法是什么?
I have a model that uses a serialized column:
class Form < ActiveRecord::Base
serialize :options, Hash
end
Run Code Online (Sandbox Code Playgroud)
Is there a way to make this serialization use JSON instead of YAML?
这是我使用流畅查询构建器的查询.
$query = DB::table('category_issue')
->select('issues.*')
->where('category_id', '=', 1)
->join('issues', 'category_issue.issue_id', '=', 'issues.id')
->left_join('issue_subscriptions', 'issues.id', '=', 'issue_subscriptions.issue_id')
->group_by('issues.id')
->order_by(DB::raw('COUNT(issue_subscriptions.issue_id)'), 'desc')
->get();
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,我通过连接表中的计数进行排序.这工作正常.但是,我希望这个计数随我的选择而返回.
这是我的原始续集查询,工作正常.
Select issues.*, COUNT(issue_subscriptions.issue_id) AS followers
FROM category_issue JOIN Issues ON category_issue.issue_id = issues.id
LEFT JOIN issue_subscriptions ON issues.id = issue_subscriptions.issue_id
WHERE category_issue.category_id = 1
GROUP BY issues.id
ORDER BY followers DESC
Run Code Online (Sandbox Code Playgroud)
如何使用Laravel的流畅查询构建器进行此选择?我知道我可以使用原始的SQL查询但我想尽可能避免这种情况.任何帮助将不胜感激,提前谢谢!
有没有人知道确定Rails关联是否已被急切加载的方法?
我的情况:我有一个结果集,有时其中一个关联是急切加载的,有时它不是.如果它没有急切加载,那么我想使用ActiveRecord的查找查找关联.如果它是急切加载,我想使用检测.
例如,假设我的项目模型中有一个shipping_info对象的"has_many"数组.然后:
如果项目是急切加载的,最有效的负载是:
item.shipping_infos.detect { |si| si.region == "United States" }
Run Code Online (Sandbox Code Playgroud)
如果项目未加载,则最有效的加载是:
item.shipping_infos.where(region: "United States").first
Run Code Online (Sandbox Code Playgroud)
但除非我知道它是否是急切加载,否则我不知道要调用哪些代码来有效地获取记录.如果我在第一种方法没有急切加载时使用它,那么我必须查找超过必要的DB记录.如果我在急切加载时使用第二种方法,那么我的急切加载对象将被忽略.
我正在使用Rails的accepts_nested_attributes_for方法取得了巨大的成功,但是如果记录已经存在,我怎么能不创建新的记录呢?
举例来说:
假设我有三个模型,团队,会员和玩家,每个团队都有很多玩家通过会员资格,玩家可以属于很多团队.然后,团队模型可以接受玩家的嵌套属性,但这意味着通过组合团队+玩家形式提交的每个玩家将被创建为新的玩家记录.
如果我只想以这种方式创建一个新的播放器记录,如果还没有同名的播放器,我应该怎么做呢?如果是具有相同名称的玩家,没有新玩家记录应当建立,而是正确的玩家应该发现并用新的球队纪录有关.
对于普通列,您可以通过columns类方法获取它们.但是,如果foreign_key在关系方法中设置了选项,则可以将关联命名为完全不同的名称.例如,给定
class Post
has_many :comments, :foreign_key => :message_id # this is a contrived example
end
Run Code Online (Sandbox Code Playgroud)
如果我这样做Post.column_names我可以得到message_id,但有没有办法得到comments?
我有2个型号.Report并且Server有一个belongs_to和has_many关系.我创建了一个使用的访问器方法delegate,允许Report找到它的关联Server.company_id.现在,我想运行一个查询Report,允许我查找Report与Server具有特定company_id属性5 的特定属性相关联的所有内容.
这是我的两个型号.是的,我知道当前的查询不起作用,因为Report没有属性company_id.
不,我不想存储company_id内部,Report因为该信息不属于Report.
报告
class Report < ActiveRecord::Base
belongs_to :server
delegate :company_id, :to => :server
class << self
def method(url, base_url)
#Report.where(company_id: 5)
end
end
end
Run Code Online (Sandbox Code Playgroud)
服务器
class Server < ActiveRecord::Base
attr_accessible :company_id
has_many :reports
end
Run Code Online (Sandbox Code Playgroud) 在Ruby中取消定义方法非常简单,我可以使用undef METHOD_NAME.
班级有类似的东西吗?我在MRI 1.9.2.
我必须取消定义ActiveRecord模型,运行两行代码,然后将模型恢复为原始形式.
问题是,我有一个模型Contact,我正在使用公司的API,并且碰巧他们有一些叫做的类Contact,而改变我的模型名称对我来说将是很多工作.
在这种情况下我该怎么办?
activerecord ×10
ruby ×5
associations ×1
eloquent ×1
fluent ×1
forms ×1
json ×1
laravel ×1
mysql ×1
reflection ×1
scripting ×1
validation ×1
yaml ×1