Tag: activerecord

Rails:实现可重用的Comment模型

我有一个评论模型,我也有一个video和照片模型。 现在,我想让我的video和照片模型有have_many评论,但这意味着我的评论模型必须拥有一个belongs to :video和一个belongs_to :model (以及数据库中每个模型的外键)。 现在说我在同一个应用程序中创建了一个Post模型,我希望它有很多注释,这意味着我必须将belongs_to :post添加到我的Comment类中。 在rails中有更好的方法来实现Comment模型,当有许多其他模型与它有关联时,或者这是如何完成的? 任何建议将不胜感激。

使用ActiveRecord高效生成报告

我们需要生成报告,这些报告可以提取大量数据,运行一些计算并将它们作为较大表的一部分进行吐出。 这样做并不困难。 但是,使它可以使用现有方法并且不生成1000个SQL查询要困难得多。 例如,我可能有一个Account类,其方法如下: def balance_at(time=Time.now) payments_out = self.payments.where(“created_at <= ?",time).sum("amount") payments_in = self.payments_on_account.where("created_at <= ?",time).sum("amount") payments_in – payments_out end 这可用于在月初和最后获得帐户余额。 它很棒。 但是,如果我想要一个包含月初和月末所有Account余额的表格,那么事情就会变得愚蠢。 例如: Account.includes(:payments, :payments_on_account) 如果我想完全用Ruby来解决这个问题,那么将获得我需要的所有数据,但是我很好的小方法balance_at并没有完成Ruby中的所有数字运算(对于个别情况来说会很慢)。 我可以用Ruby和SQL中的东西解决它,具体取决于缓存的内容,如下所示: def balance_at(time=Time.now) payments_out, payments_in = [payments, payments_on_account].map{|payments| if payments.loaded? payments.find_all{|p| p.created_at < time }.inject(0){|a,p| p.amount + a } else payments.where("created_at <= ?",time).sum("amount") end } payments_in – payments_out […]

如何使Active Record连接返回唯一对象?

我有一个简单的查询需求:查找自2013年1月1日起订购的用户列表。 在SQL中,这是一个非常简单的查询。 但我正在使用Rails和Active Record。 所以我写道: User.joins(:orders).where(“orders.created_at >= ‘2013-01-01 00:00:00′”) 在我们的数据库中,我们自2013年1月1日起有75个用户发出了100个订单。 (显然有些用户发了多个订单。) 但是,上面的表达式返回100个用户。 (必须有重复。) 我试过User.joins(:orders).where(“orders.created_at >= ‘2013-01-01 00:00:00′”).uniq 这也行不通。 如何获得自2013年1月1日起订购的75位用户?

Rails迁移的命名约定

是否有Rails迁移的最佳实践命名约定,特别是在编辑模型时? 例如,如果我在Foo模型中添加一个列bar ,我应该将其命名为edit_foo或add_bar_to_foo 我假设如果我正在编辑多个模型,那么我应该创建多个迁移,但是如果我对单个模型进行多次修改,我会将其命名为add_bar_remove_x_edit_y_to_foo吗?

Rails:你能将参数传递给after_create方法吗?

在我的应用程序中,只有具有管理员角色的用户才可以创建新用户。 在新用户表单中,我为可能分配给新用户的每个可用角色都有一个选择框。 我希望使用after_create回调方法将角色分配给用户。 如何在after_create方法中访问选择框的选定值? def create @user = User.new(params[:user]) respond_to do |format| if @user.save flash[:notice] = ‘User creation successful.’ format.html { redirect_to @user } else format.html { render :action => ‘new’ } end end end 在用户模型中,我有: after_create :assign_roles def assign_roles self.has_role! ‘owner’, self # self.has_role! params[:role] end 我收到错误,因为模型不知道是什么角色。

Rails 4.1.0尝试从子表更新父表时没有方法错误

我有2个rails模型,一个security和stock_quote模型,如下所示 class StockQuote < ActiveRecord::Base belongs_to :security, class_name: "Security", foreign_key: 'security_id' def self.price_on(date) where("date(created_at) = ?", date).sum(:high) end feed_url = "https://spreadsheets.google.com/feeds/list/1ncyK8uXoeLobVkdiSKQcYJr2joK_uN5QSBB3814GKaw/od6/public/values" def self.update_from_feed(feed_url) feed = Feedjira::Feed.fetch_and_parse(feed_url) unless feed.is_a?(Fixnum) add_entries(feed.entries) else puts "not an array\n" end end private def self.add_nonexistent_security(entry) a = StockQuote.create_security(security: entry.title.capitalize, category: "Uncategorized") end def self.save_entry(entry,security_id) unless exists? guid: entry.id contents = entry.content.split(',').map […]

获取每个组的第一条记录列表

我有一个包含以下列的Log模型: [“id”, “username”, “event”, “parameters”, “extras”, “created_at”, “updated_at”] 现在,我想获取created_at命令的每个username的第一个日志。 一种方法是为每个用户名运行以下查询: log = Log.where(“username = :username”, username: username).order(:created_at).first 但这显然会多次查询数据库(等于用户名的数量)。 有没有办法只做一个数据库查询?

如何通过多个模型引用和更改额外值

我有通过piece_lineup模型加入的阵容和件模型(有很多通过)。 我在piece_lineup模型中添加了一个’status’列,但我无法弄清楚如何引用该属性和/或更改它。 列出与阵容相关联的作品时,我还想列出与该阵容相关的作品的状态。 我怎么做?

如何在Postgres中进行查询以按月创建分组记录? (:created_at datetime列)

我有这个Ruby代码: def visits_chart_data(domain) last_12_months.collect do |month| { created_at: month, count: domain.visits.created_on_month(month).count } end end def last_12_months (0..11).to_a.reverse.collect{ |month_offset| month_offset.months.ago.beginning_of_month } end CreatedOnMonth只是一个范围: scope :created_on_month, -> (month = Time.now) { where{ (created_at >= month.beginning_of_month) & (created_at <= month.end_of_month) } } created_at只是一个标准的日期时间戳。 如何优化它以进行一次查询而不是12? 我看到有些人使用GROUP_BY,但是我对PostgreSQL不太好,能够自己构建这样的查询。 查询应按年份对记录进行分组并返回计数。 也许有人可以帮助我。 谢谢。

Rails 3 ActiveRecord .skip_callback线程安全

这段代码线程安全吗? MyModel.skip_callback(:save, :before, :my_callback) my_model_instance.update_attributes(attributes) MyModel.set_callback(:save, :before, :my_callback) 我可以安全地使用它来避免递归重新触发相同的回调吗? 这是一个例子 class Blog :active_theme_id_changed? # … private def update_blog_theme # Reuses a previously used BlogTheme or creates a new one blog_theme = BlogTheme.find_by_theme_id_and_blog_id( self.active_theme_id, self.id) blog_theme ||= BlogTheme.create!( :theme_id => active_theme_id, :blog_id => self.id ) Blog.skip_callback(:save, :after, :update_blog_theme) self.update_attributes!(:active_blog_theme_id => blog_theme.id) Blog.set_callback(:save, :after, :update_blog_theme) end end