我是角色的忠实粉丝,但它有一些棘手的概念,它们之间存在极其微妙的差异,这就是其中之一.
我只想创建一个类,我可以用它在我的Angular控制器和工厂中创建自定义对象.它肯定不应该那么难,但我无法弄清楚如何做到这一点.我想有一个自定义的ResultSet类,我可以实例化它来创建ResultSet的实例.然而,对于我的生活,我无法弄清楚工厂诉服务的正确语法.
这是所有我想要的:
ResultSet = function(dataSet){
this.filter = function(){
# filters and returns dataSet
# ...
}
}
Run Code Online (Sandbox Code Playgroud)
然后我希望能够在控制器内实例化ResultSet的实例等:
MyApp.controller('pageCtrl', ['ResultSet', (ResultSet) ->
# ...
rs = ResultSet.new(dataToFilter)
Run Code Online (Sandbox Code Playgroud)
使用Angular Service而不是Factory似乎更正确,因为服务返回一个对象的实例(这正是我想要的).但我无法弄清楚如何做到这一点......
我如何使用服务来声明我的自定义ResultSet类,然后如何从中实例化实例?
我想用一种简单的方法来表示对象列表的顺序.当一个对象改变该列表中的位置时,我想只更新一个记录.我不知道是否可以这样做,但我有兴趣问这个问题......
为什么我只关心一次更新一个项目...
[更新澄清问题]
此算法的用例是具有CRUDy,资源丰富的服务器设置和干净(Angular)客户端的Web应用程序.
最好在可能的情况下保持纯CRUD操作,并使代码更加清晰.如果我可以在单个resource#update请求中执行此操作,那么我不需要任何额外的服务器端代码来处理重新排序,并且可以使用CRUD完成所有操作而无需进行任何更改.
如果需要为每个移动更新列表中的多个项目,那么我需要在我的控制器上执行新操作来处理它.它不是一个showstopper,但它开始蔓延到Angular,一切都变得不那么理想应该是干净的.
假设我们有一本杂志,杂志有很多页面:
Original magazine
- double page advert for Ford (page=1)
- article about Jeremy Clarkson (page=2)
- double page advert for Audi (page=3)
- article by James May (page=4)
- article by Richard Hammond (page=5)
- advert for Volkswagen (page=6)
Run Code Online (Sandbox Code Playgroud)
...我们每次更新最多N条记录
如果我想将Richard Hammond的页面从第5页拉到第2页,我可以通过更改页码来实现.但是我还必须改变它取代的所有页面:
Updated magazine
- double page advert for Ford (page=1)
- article by Richard Hammond (page=2)(old_value=5)*
- article …Run Code Online (Sandbox Code Playgroud) 在热切加载的文档中,声明:
如果您急切地使用指定的:limit选项加载关联,它将被忽略,返回所有关联的对象:
class Picture < ActiveRecord::Base
has_many :most_recent_comments, :class_name => 'Comment',
:order => 'id DESC', :limit => 10
end
Run Code Online (Sandbox Code Playgroud)
Picture.find(:first,:include =>:most_recent_comments).most_recent_comments#=>返回所有相关注释.
如果是这种情况,那么实现加载"限制"的最佳方法是什么?
假设我们急切地将最近10篇博客帖子加载到博客的首页上,我们显然不希望它们都是如此,那么是否应该指定帖子集合的限制和排序?
除此之外,可以在深度加载的元素上指定相同的条件 - 例如,仅在每篇博客文章中显示前三个评论吗?
Blog.find(:blog_id, :include => {:posts => :comments } )
Run Code Online (Sandbox Code Playgroud) 鉴于我有一个网站,其中大部分资源都有数字ID(即user.id question.id等),但就像德国人回顾二战时我宁愿不向观察者透露这些,最好的方法是什么混淆他们?
我认为该方法将涉及.to_param,然后是一些对称加密算法,但我不确定什么是最有效的加密,以及它将如何影响数据库中的查找时间等.
我们非常感谢道路上的任何建议.
在许多控制器的编辑方法中,您初始化一个新对象并编辑现有对象
class MagazinesController < ApplicationController
def edit
@magazine = Magazine.find(params[:magazine_id])
@page = Page.find(params[:id])
@new_page = @magazine.pages.new
end
end
Run Code Online (Sandbox Code Playgroud)
但是在视图中,您通常需要循环遍历持久化对象并分别处理新对象
# magazines#edit
%h4 Existing pages
- @magazine.pages.each do |page|
%p= link_to page, page.title
Run Code Online (Sandbox Code Playgroud)
...该pages关联包含现有(持久)页面以及我们通过的新页面@new_page = @magazine.pages.new.
这很容易处理,但它很难看
%h4 Existing pages
- @magazine.pages.each do |page|
- if page.persisted?
%p= link_to page, page.title
Run Code Online (Sandbox Code Playgroud)
我想使用一些关联方法来只选择那些持久化的页面:
%h4 Existing pages
- @magazine.pages.persisted.each do |page|
%p= link_to page, page.title
Run Code Online (Sandbox Code Playgroud)
有没有办法做到这一点?
当前详细的rails路径助手
我经常编写代码来获取以下URL:
link_to @applicant.name, company_job_applicant_path(@company, @job, @applicant)
Run Code Online (Sandbox Code Playgroud)
但是这段代码看起来更像是这个(冗余)片段:
link_to @applicant.name, company_job_applicant_path(@applicant.job.company, @applicant.job, @applicant)
Run Code Online (Sandbox Code Playgroud)
这太傻了.
必需的'pert'路径助手
其他参数可以清楚地从@job中导出.我真正需要输入的是:
link_to @applicant.name, applicant_quick_path @applicant
Run Code Online (Sandbox Code Playgroud)
哪里有一个定义:
def applicant_quick_path applicant
company_job_applicant_path(applicant.job.company, applicant.job, applicant)
end
Run Code Online (Sandbox Code Playgroud)
我的问题
Rails Way做是否合理app.company_path.我如何从控制台访问我的新助手方法?我需要构建一个简单的分析后端来捕获用户行为.这将通过网页上的Javascript代码段捕获,就像Google Analytics或Mixpanel数据一样.
系统需要捕获接近实时的浏览器数据(滚动页面位置,鼠标位置等).它将每5秒记录一次用户页面的状态.每次测量只有三个属性,但必须经常进行.
数据不一定需要每5秒发送一次,它可以不那么频繁地加速,但是当用户在页面上时,我必须获得所有数据.即我不能每分钟一次公共汽车,并在119秒后离开的人丢失最后59秒的数据.
如果可能的话,我想建立一个在可预见的未来可扩展的系统,这意味着它可以为10,000个站点工作,每个站点有100个并发访问者,即100,000个并发用户,每个用户每5秒发送一个事件.
我并不担心查询数据,可以使用单独的系统来完成.我最感兴趣的是如何处理数据本身的捕获.
根据上述预算,系统需要处理来自100,000个用户的每秒20,000个事件.
我想在Heroku上托管这项服务,但是当我用Rails做了很多工作时,我对高吞吐量系统完全不熟悉(除了知道你不使用Rails处理它们).
Angular有许多选项可以根据输入字段中的事件延迟对模型的更新:
<input type="text" name="username"
ng-model="user.name"
ng-model-options="{updateOn: 'default blur',
debounce: {default: 500, blur: 0} }" />
Run Code Online (Sandbox Code Playgroud)
Angular提供的基本选项允许将输入表单的编辑与模型的实际更新分离.这有一些很好的奖励,因为如果我们决定取消该更新,我们可以回滚对象的值.
但是,我想延迟模型的更新,而不是基于输入字段上的事件,而是基于某人单击提交按钮.
理想情况下,我喜欢用户可以更新输入的.user表单(例如,对于表单,页面中的任何绑定元素{{user.first_name}}等都不会更新,然后当用户单击提交时,这些更新会提交给模型.
同样,如果用户单击"取消",则可以回滚所有更新.
<input type="text" name="username"
ng-model="user.name"
ng-model-options="{updateOn: 'myCustomEvent' }" />
<button onClick="broadCastMyCustomEventIntoForm()">Save changes</>
Run Code Online (Sandbox Code Playgroud)
这可能吗?
我想在从has_many关联中删除对象之前运行一些代码.
我认为我可以用before_remove回调做到这一点,但由于某种原因,这不是解雇,我不明白为什么.
class Person < ActiveRecord::Base
has_many :limbs, before_remove: :print_message
def print_message
puts 'removing a limb'
end
end
class Limb < ActiveRecord::Base
belongs_to :person
end
Run Code Online (Sandbox Code Playgroud)
虽然这个代码应该在肢体破坏期间打印"去除肢体",但事实并非如此.
p = Person.create;
l = Limb.create person: p;
p.limbs.first.destroy
# SQL (2.1ms) DELETE FROM "limbs" WHERE "limbs"."id" = ? [["id", 5]]
# => #<Limb id: 5, person_id: 3, created_at: "2012-01-17 11:28:01", updated_at: "2012-01-17 11:28:01">
Run Code Online (Sandbox Code Playgroud)
为什么此destroy操作不会导致该print_message方法运行?
编辑 - 这before_remove回调存在吗?
很多人都问过这个回调是否存在.虽然我可以找到很少的进一步引用,但它在Rails文档中有记录:
我想使用Squeel重构下面的查询.我想这样做,以便我可以链接其中的运算符并重新使用查询的不同部分中的逻辑.
User.find_by_sql("SELECT
users.*,
users.computed_metric,
users.age_in_seconds,
( users.computed_metric / age_in_seconds) as compound_computed_metric
from
(
select
users.*,
(users.id *2 ) as computed_metric,
(extract(epoch from now()) - extract(epoch from users.created_at) ) as age_in_seconds
from users
) as users")
Run Code Online (Sandbox Code Playgroud)
查询必须全部在DB中运行,并且不应该是混合Ruby解决方案,因为它必须对数百万条记录进行排序和切片.
我已经设置了问题,因此它应该针对普通user表运行,以便您可以使用它的替代方案.
User具有所有常规属性的对象extra_metric_we_care_about,age_in_seconds和compound_computed_metric下面的解决方案不起作用,但它显示了我希望实现的优雅类型
class User < ActiveRecord::Base
# this doesn't work - it just illustrates what I want to achieve
def self.w_all_additional_metrics
select{ ['*',
computed_metric,
age_in_seconds,
(computed_metric …Run Code Online (Sandbox Code Playgroud)