标签: rails-activerecord

为Active Record中的add_column和add_index添加唯一:true

即使我的应用程序不允许用户键入某个位置,我也希望在数据库中强制执行城市的唯一性.由于我的Rails应用程序将在city列上搜索,我想在city列上添加一个索引,但是想知道是否重要的​​是添加唯一:true也在索引上.这是重复吗?如果这没有意义,如果你能解释原因,我将非常感激.

class CreateLocations < ActiveRecord::Migration
  def change
    create_table :locations do |t|
      t.string :city, unique: true
      t.string :state

      t.timestamps
    end

    add_index :locations, :city, unique: true
  end
end
Run Code Online (Sandbox Code Playgroud)

ruby-on-rails rails-activerecord

13
推荐指数
3
解决办法
9804
查看次数

路由关注和多态模型:如何共享控制器和视图?

鉴于路线:

Example::Application.routes.draw do
  concern :commentable do
    resources :comments
  end

  resources :articles, concerns: :commentable

  resources :forums do
    resources :forum_topics, concerns: :commentable
  end
end
Run Code Online (Sandbox Code Playgroud)

而型号:

class Comment < ActiveRecord::Base
  belongs_to :commentable, polymorphic: true
end
Run Code Online (Sandbox Code Playgroud)

当我编辑或添加评论时,我需要回到"可评论"对象.但是我有以下问题:

1)redirect_tocomments_controller.rb根据父对象上的将是不同

2)关于观点的参考文献也会有所不同

= simple_form_for comment do |form|
Run Code Online (Sandbox Code Playgroud)

是否有实用的方法来共享此comment资源的视图和控制器?

ruby-on-rails polymorphic-associations ruby-on-rails-4 rails-activerecord

13
推荐指数
2
解决办法
2840
查看次数

使用两个外键确定范围

我有以下架构: 在此输入图像描述

我想要选择同时调用proposalsforeign_keys(author_ideditor_id)以及单独的(例如author_proposalseditor_proposals),我需要选择延迟或急切加载它们(例如User.includes(:proposals)或没有它joins).

更新:

#I have the scopes which is like this:
class User < ActiveRecord::Base
  has_many :author_proposals, class_name: 'Proposal', foreign_key: :author_id
  has_many :editor_proposals, class_name: 'Proposal', foreign_key: :editor_id
end

class Proposal < ActiveRecord::Base
  belongs_to :author, class_name: 'User', foreign_key: :author_id
  belongs_to :editor, class_name: 'User', foreign_key: :editor_id
end
Run Code Online (Sandbox Code Playgroud)

但我需要一个通用的一个,它会给我所有的提案(包括author_proposalseditor_proposals),这也将跃跃欲试加载它们.我应该使用条件has_many吗?

ruby activerecord ruby-on-rails rails-activerecord

13
推荐指数
2
解决办法
718
查看次数

index:true vs foreign_key:true(Rails)

按照指南,我运行以下命令:

rails g migration CreateSnippetsUsers snippet:belongs_to user:belongs_to
Run Code Online (Sandbox Code Playgroud)

这创建了以下迁移:

class CreateSnippetsUsers < ActiveRecord::Migration[5.0]
  def change
    create_table :snippets_users do |t|
      t.belongs_to :snippet, foreign_key: true
      t.belongs_to :user, foreign_key: true
    end
  end
end
Run Code Online (Sandbox Code Playgroud)

在过去,我见过同样的事情,而index: true不是foreign_key: true.这两者有什么区别?

ruby-on-rails rails-migrations rails-activerecord ruby-on-rails-5

13
推荐指数
2
解决办法
9280
查看次数

Rails:模型实例方法还是辅助方法?

按照惯例,是否应将以下内容定义为我的模型或辅助方法的实例方法?

# app/models/user.rb
class User < ActiveRecord::Base
  def full_name
    "#{first_name} #{last_name}"
  end
end
Run Code Online (Sandbox Code Playgroud)

要么

# app/helpers/users_helper.rb
module UsersHelper
  def full_name
    "#{@user.first_name} #{@user.last_name}"
  end
end
Run Code Online (Sandbox Code Playgroud)

非常感谢.

ruby ruby-on-rails ruby-on-rails-3 rails-activerecord

12
推荐指数
2
解决办法
3837
查看次数

仅覆盖默认范围(特别是顺序),而不是Rails中的其他内容

所以基本上我有两个班,作者.书籍可以有多个作者,作者可以有多本书.书籍具有以下默认范围.

default_scope :order => "publish_at DESC"
Run Code Online (Sandbox Code Playgroud)

在作者展示页面上,我想列出与该作者相关的所有书籍,所以我说以下内容......

@author = Author.find(params[:id])
@books = @author.books
Run Code Online (Sandbox Code Playgroud)

到目前为止一切都很好.作者#show页面列出了按出版日期排序的所有属于该作者的书籍.

我也在研究一种能够按照书籍的受欢迎程度排序的宝石.

@books = @author.books.sort_by_popularity
Run Code Online (Sandbox Code Playgroud)

问题是每当它尝试排序时,default_scope总是会妨碍.如果我试图取消它之前它将摆脱作者关系并返回数据库中的每本书.例如

@books = @author.books.unscoped.sort_by_popularity # returns all books in database
Run Code Online (Sandbox Code Playgroud)

我想知道我是否可以使用ActiveRelation except()方法 做这样的事情(看起来它应该工作,但事实并非如此.它忽略了顺序,只是当它是default_scope命令时)

def sort_by_popularity
  self.except(:order).do_some_joining_magic.order('popularity ASC')
  #    |------------|                       |---------------------|
end
Run Code Online (Sandbox Code Playgroud)

关于为什么这不起作用的任何想法?关于如何以不同的方式工作的任何想法?我知道我可以摆脱default_scope,但我想知道是否还有另一种方法可以做到这一点.

activerecord ruby-on-rails default-scope rails-activerecord

12
推荐指数
1
解决办法
4756
查看次数

rails 3.0.12如何检查我的activerecord版本是什么?

也许这是一个愚蠢的问题,但我需要在一些表中使用多个主键...

create table t1
(
 id int not null
 id_something int not null
 .
 .
 .
 primary key (id, id_something)
)
Run Code Online (Sandbox Code Playgroud)

我用Google搜索,发现了这个宝石http://rubygems.org/gems/composite_primary_keys

但是我找不到我有的activerecord版本

我正在使用rails 3.0.12和ruby 1.9.2p320

ruby-on-rails-3 rails-activerecord

12
推荐指数
1
解决办法
4468
查看次数

Rails ActiveRecord在一个查询中执行Group,Sum和Count

我有两张桌子,

Order (ID, Value)
Run Code Online (Sandbox Code Playgroud)

OrderType (ID, Name [Quote, Sale, Purchase, etc])
Run Code Online (Sandbox Code Playgroud)

我想获得每种类型(计数)的订单总数以及每种类型的订单总数(总和)

我可以单独使用这些

Order.group(:order_type).count(:id)
Run Code Online (Sandbox Code Playgroud)

Order.group(:order_type).sum(:value)
Run Code Online (Sandbox Code Playgroud)

我想在一个查询中执行这些,相当于以下SQL

SELECT
  order_types.id, Count(*) as total_count, Sum(orders.value) As total_value
FROM
  order
JOIN
  order_types ON orders.order_type_id = order_types.ID
GROUP BY
  order_types.id
Run Code Online (Sandbox Code Playgroud)

查询还应返回完整OrderType对象,以便在视图中显示名称

ruby ruby-on-rails rails-activerecord

12
推荐指数
3
解决办法
3586
查看次数

如果after_initialize回调返回false,则返回nil对象

我的Rails应用程序有许多形成层次结构的模型.例如:零售商>部门>产品类别>产品>审核.

业务要求是高权限用户可以与新的或现有的"普通"用户"共享"层次结构中的任何单个元素.如果没有与它们共享对象,普通用户无权查看(或执行任何其他操作)层次结构的任何级别中的任何对象.

共享过程包括选择共享是否授予对目标对象的只读,读取更新或完整CRUD的权限.

共享任何对象将授予该对象和层次结构中所有较低级别对象的R/O,R/W或CRUD权限,以及对该对象的所有直接祖先的R/O权限.对象集合有机增长,因此权限系统只需记录user_id,共享的object_id和共享的性质(R/O,CRUD等)即可.由于此层次结构中的对象总体一直在增长,因此在DB中为每个用户/对象组合创建显式权限记录是不切实际的.

相反,在用户请求周期开始时,ApplicationController收集所有权限记录(用户X对部门#5具有CRUD权限)并将其保存在内存中的哈希中.权限模型知道如何在传递任何对象时评估哈希值 - Permission.allow?(:show,Department#5)将返回true或false,具体取决于用户权限哈希的内容.

我们来看,例如,部门模型:

# app/models/department.rb
class Department < ActiveRecord::Base

  after_initialize :check_permission

  private

  def check_permission
    # some code that returns true or false 
  end

end
Run Code Online (Sandbox Code Playgroud)

check_permission方法返回true时,我想Department.first恢复数据库中的第一条记录,但是,如果check_permission返回false,我想返回nil.

现在,我有一个解决方案,默认范围触发权限检查,但这导致查询数量的2倍,对于具有大量对象的类,内存问题和时间/性能问题肯定会出现.

我的目标是使用after_initialize回调来预先允许对象.

然而,似乎after_initialize无法阻止原始对象被返回.它允许我重置对象属性的值,但不能免除它.

有谁知道如何实现这一目标?

编辑:

非常感谢到目前为止提供的所有答案和评论; 希望这个问题的扩展版本能够澄清事情.

activerecord ruby-on-rails callback rails-activerecord

12
推荐指数
2
解决办法
880
查看次数

渴望加载,具体取决于Ruby on Rails中的关联类型

我有一个多态关联(belongs_to :resource, polymorphic: true),其中resource可以有各种不同的模型.为简化问题,假设它可以是a Order或a Customer.

如果它是Order我想要预加载订单,并预加载Address.如果是客户我想预加载Customer并预加载Location.

使用这些关联的代码执行如下操作:

<%- @issues.each do |issue| -%>
<%- case issue.resource -%>
<%- when Customer -%>
<%= issue.resource.name %> <%= issue.resource.location.name %>
<%- when Order -%>
<%= issue.resource.number %> <%= issue.resource.address.details %>
<%- end -%>
Run Code Online (Sandbox Code Playgroud)

目前我的预装用途:

@issues.preload(:resource)
Run Code Online (Sandbox Code Playgroud)

但是我仍然看到加载条件关联的n加一个问题:

SELECT "addresses".* WHERE "addresses"."order_id" = ...
SELECT "locations".* WHERE "locations"."customer_id" = ...
...
Run Code Online (Sandbox Code Playgroud)

有什么好办法解决这个问题?是否可以手动预加载关联?

ruby-on-rails polymorphic-associations rails-activerecord

12
推荐指数
1
解决办法
1291
查看次数