即使我的应用程序不允许用户键入某个位置,我也希望在数据库中强制执行城市的唯一性.由于我的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) 鉴于路线:
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_to在comments_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
我有以下架构:

我想要选择同时调用proposalsforeign_keys(author_id和editor_id)以及单独的(例如author_proposals和editor_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_proposals和editor_proposals),这也将跃跃欲试加载它们.我应该使用条件has_many吗?
按照指南,我运行以下命令:
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
按照惯例,是否应将以下内容定义为我的模型或辅助方法的实例方法?
# 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)
非常感谢.
所以基本上我有两个班,书和作者.书籍可以有多个作者,作者可以有多本书.书籍具有以下默认范围.
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,但我想知道是否还有另一种方法可以做到这一点.
也许这是一个愚蠢的问题,但我需要在一些表中使用多个主键...
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
我有两张桌子,
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对象,以便在视图中显示名称
我的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无法阻止原始对象被返回.它允许我重置对象属性的值,但不能免除它.
有谁知道如何实现这一目标?
编辑:
非常感谢到目前为止提供的所有答案和评论; 希望这个问题的扩展版本能够澄清事情.
我有一个多态关联(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)
有什么好办法解决这个问题?是否可以手动预加载关联?