我正在使用http://github.com/geekq/workflow来提供状态机.我正在使用ActiveRecord来保存状态,这意味着我在模型中有一个"workflow_state"属性.我想我希望状态机中的每个事件都有一个named_scope,所以我可以找到给定状态下的所有对象.例如,假设一个非常简单的状态机:
workflow do
state :new do
event :time_passes, :transitions_to => :old
end
state :old do
event :death_arrives, :transitions_to => :dead
end
state :dead
end
Run Code Online (Sandbox Code Playgroud)
我想要每个州的命名范围.然而,这不是干......我最终想要的是:
named_scope :new, :conditions => ['workflow_state = ?', 'new']
named_scope :old, :conditions => ['workflow_state = ?', 'old']
named_scope :dead, :conditions => ['workflow_state = ?', 'dead']
Run Code Online (Sandbox Code Playgroud)
但有几行不依赖于当前的州列表.
我可以看到Model#workflow_spec.states.keys为我提供了每个状态.但我认为我需要的是一个奇怪的lambda,其中范围的名称是一个变量.我不知道该怎么做.完全没有.一直盯着这几个小时和玩irb,但我认为有一些关于元编程的知识,我只是没有.请帮忙!
下面的Lucas给出了答案 - 但我们还需要将符号更改为字符串:
workflow_spec.states.keys.each do |state|
named_scope state, :conditions => ['workflow_state = ?', state.to_s]
end
Run Code Online (Sandbox Code Playgroud) 我已经设置了一个模型结构,允许不同的模型通过has_many ...:through ...关联文件模型,该关联也是多态的,因此文件可以属于许多不同的模型,不同的资源可以有很多文件.
然后,File模型属于Attachment模型,它是实际文件,但我使用File模型来跟踪不同的版本.附件模型知道文件是否是图像.
这是基本的模型结构:
class Resource < ActiveRecord::Base
has_many :file_associations, :as => :association
has_many :files, :through => :file_associations
...
end
class FileAssociation < ActiveRecord::Base
belongs_to :r_file
belongs_to :association, :polymorphic => true
...
end
class File < ActiveRecord::Base
has_many :file_associations
belongs_to :attachment
named_scope :images, lambda { { :include => :attachment,
:conditions => "attachments.type = 'AttachmentImage'" } }
...
end
Run Code Online (Sandbox Code Playgroud)
然后,我使用此设置从特定资源中检索具有附件的所有文件,该附件是图像,如下所示:
@resource.files.images
Run Code Online (Sandbox Code Playgroud)
当我检查由此生成的SQL查询时,它包含了使用FileAssociation两次加入Resource的条件:
SELECT ....
FROM `files`
LEFT OUTER JOIN `attachments` ON `attachments`.id = `files`.attachment_id
INNER JOIN `file_associations` ON `files`.id = …Run Code Online (Sandbox Code Playgroud) 我正在尝试实现 Ryan Bates 的可排序表列代码(Railscast #228),但我希望能够对关联列进行排序。特别是,我有以下模型和关联:
class Project < ActiveRecord::Base
belongs_to :program_manager, :class_name => "User"
class User < ActiveRecord::Base
has_many :program_manager_projects, :class_name => "Project", :foreign_key => "program_manager_id"
Run Code Online (Sandbox Code Playgroud)
项目模型和用户模型之间的关联由“program_manager_id”外键调节,用户使用集合选择下拉列表在新/编辑视图中设置该外键。这是project.rb顶部注释的一部分:
# Table name: projects
# program_manager_id :integer
Run Code Online (Sandbox Code Playgroud)
我希望能够按项目经理的姓名(即project.program_manager.name)对索引视图中的项目列表进行排序。
理想情况下,我能够以某种方式将 :order 指向这个名称,也许在我的 ProjectsController 的索引方法中使用类似的东西:
@projects = Project.find(:all, :order => project.program_manager.name)
Run Code Online (Sandbox Code Playgroud)
但这显然行不通(更不用说 Ryan 的例程通过对要排序的模型中的表名称的特定引用来实现这一点。)
我遇到过一些使用named_scope的令人生畏的方法,例如:
named_scope :most_active, :select => "questions.*", :joins => "left join comments as comments_for_count on comments_for_count.question.id = questions.id", :group => "questions.id", :order => "count(questions.id) desc"
Run Code Online (Sandbox Code Playgroud)
但由于我缺乏 MySQL 专业知识,这对我来说相当难以理解。
任何人都可以帮助我针对我的具体情况概括上面的named_scope示例,或者为我指出一个更直接的策略吗?
非常感谢,
院长
我正在寻找一个答案,它将通过(最好)一个named_scope返回一个用户对象数组,或者通过User模型上的类方法返回一些操作.
所以没有进一步的...
我有两个表:用户和战斗.
战斗有以下几个关注的栏目:
如您所见,用户可以是挑战者或挑战者,但不是两者.
我有一个原始的SQL语句,它返回按最多wins属性分组的战斗机属性(user_id):
SELECT a.fighter, COUNT(*) AS wins
FROM (SELECT challenger_id AS fighter
FROM fights
WHERE challenger_won = TRUE
UNION ALL
SELECT challengee_id AS fighter
FROM fights
WHERE challenger_won = FALSE
) AS a
GROUP BY a.fighter;
Run Code Online (Sandbox Code Playgroud)
所以给定这个信息,如何通过(最好)一个named_scope返回一个用户对象数组,或者通过用户模型上的类方法进行一些操作?
有没有办法混合命名范围和狮身人面像范围?我不敢相信没有.
我在课程中有狮身人面像指数.一旦用户购买课程,他们就会有一个屏幕,可以看到他们所有课程的列表.我希望他们在网站范围内的课程中执行相同的搜索,但确定他们拥有的搜索范围.
对于仅限sphinx的范围,这显然是不可能的,因为我没有索引采购数据,我认为我也不应该这样做.
有没有办法实现这个目标?
这就是我到目前为止"结合"这两个系统的原因.对我来说似乎很骇然但它有效:
lesson_ids = current_user.active_products_by_type(:lessons).collect{|x| x.id}
@lessons = Lesson.active_scope.search :with => {:id => lesson_ids }
Run Code Online (Sandbox Code Playgroud) 我有User模特哪个has_many :notifications.Notification有一个布尔列seen和一个调用的范围:unseen,它返回所有通知所在的seen位置false.
class User < ApplicationRecord
has_many :notifications
has_many :unseen_notifications, -> { unseen }, class_name: "Notification"
end
Run Code Online (Sandbox Code Playgroud)
我知道如果我添加一个名为to 的列并添加到我的调用中,我可以缓存通知的数量.notifications_countuserscounter_cache: truebelongs_toNotification
但是,如果我想缓存用户拥有的看不见的通知数量呢?即缓存unseen_notifications.size而不是notifications.size?有没有内置的方法来实现这一点,counter_cache还是我必须推出自己的解决方案?
activerecord named-scope ruby-on-rails associations counter-cache
我正在尝试合并两个范围或向现有范围添加更多内容。
scope :public_bids, -> {
where(status: [Status::ACCEPTED, Status::OUTBID, Status::SOLD, Status::NO_SALE],
bid_type: [BidType::MANUAL, BidType::AUTO, BidType::LIVE])
scope :outbid_maxbids, -> {
where(status: Status::OUTBID, bid_type: BidType::MAXBID)
Run Code Online (Sandbox Code Playgroud)
我无法确定如何将OR它们组合在一起或合并到一个范围中。有什么建议/指导吗?我更希望将它们合并到一个范围中。
我写了一个便利API,用于在TensorFlow中定义我的模型,公开一个范围对象.现在我想在添加操作之前验证用户是否实际进入了作用域.如何在TensorFlow中获取当前活动的tf.variable_scope的名称?
是否有可能在同一活动中有来自不同范围的两个片段,其中活动与其中一个片段在同一范围内。我在这里写了示例代码(https://github.com/damirmiljkovic/daggerimplementation),您可以查看它。
我想要实现的是具有多个片段、登录片段和用户片段的单个活动。我有用于用户身份验证的身份 URL,在用户成功通过身份验证后,API 将返回其余 API 的基本 URL。现在我有 2 个改造实例,一个是在应用程序创建时创建的,第二个是在用户登录后创建的。所以活动和登录片段在一个范围内(假设 @Singelton),而用户片段在另一个范围内(假设 @用户范围)。我需要在用户登录后立即从 API 获取用户详细信息,如果不满足某些条件,我会打开用户片段,以便用户可以填写缺少的详细信息。
我知道你可以在Rails中创建命名范围,它允许你指定可以在以后构建的条件:
named_scope :active, :conditions => {:active => true}
...
MyModel.active.find(...)
Run Code Online (Sandbox Code Playgroud)
这通过创建一个代理对象来工作,该代理对象直到稍后才进行评估.我想知道的是,是否可以创建一个动态的未命名范围?
我的意思是,有一种方法'foo'我可以去
scope = MyModel.foo(:conditions => {:target_id => 4})
Run Code Online (Sandbox Code Playgroud)
然后scope作为代理对象传递,我可以做更多的.finds或其他范围的调用?
named-scope ×10
associations ×3
mysql ×2
sql ×2
activerecord ×1
android ×1
dagger-2 ×1
lambda ×1
ruby ×1
sorting ×1
tensorflow ×1
workflow ×1